EDA365电子论坛网

标题: [求助] fprintf 怎么输出自动判断小数位的小数? [打印本页]

作者: leilei4908    时间: 2021-1-22 12:01
标题: [求助] fprintf 怎么输出自动判断小数位的小数?
比如,
decimal_places = cadr(axlDBGetDesignUnits())
可以获取当前design的小数位
但是常规输出到文件
fprintf(f "%.2f/n" num)
这里的 %.2f 是在写代码的时候就定好的
如果遇到小数位不同的情况
怎么让程序自动判断,并且输出相应位数的小数呢

目前有一种做法,将需要输出的 num ,先调整成对应位数的小数,再用
fprintf(f "%f/n" num)
输出
但是输出的数据,小数位后会有很多的补0

有没有更好的方法呢

作者: silenced    时间: 2021-1-22 13:31
帮你顶一下吧
作者: jet2001    时间: 2021-1-22 13:51
既然是 float 那小數點有幾位 應該是未知的

我的做法是看 brd 或 dra 的單位是用那一種?
unit是millimeters時 小數點我最少會取4位 或5位
unit是mils時 小數點我最少會取2位 或3位
作者: leilei4908    时间: 2021-1-25 17:05
jet2001 发表于 2021-1-22 13:51
既然是 float 那小數點有幾位 應該是未知的

我的做法是看 brd 或 dra 的單位是用那一種?

decimal_places = cadr(axlDBGetDesignUnits())
虽然能获取到当前设计的精度,但事实上,这个只是显示的数值,而不是真实的数值
真正获取到的,比如Cline的长度,根本不是通过查询显示的数值,所以还需要小数位转换
但有的图是mil单位,2位精度,有些是mm单位,4位精度
而 skill 里 fprintf 需要指定精度的位数
(比如%.2f,输出两位小数;%.4f,输出四位小数)才能输出
但不可能对每个输出,都做小数位的判断,然后使用对应的 fprintf
能否自动判断小数位呢?

作者: jet2001    时间: 2021-1-26 13:15
_unit=car(axlDBGetDesignUnits())
num=1/3.0
if(_unit=="mils" then printf("%.2f\n" num)  else printf("%.4f\n" num) )
; 只有brd unit是mil 給.2f ; 其他unit 給 .4f
; 想要更精密也可以 if(_unit=="mils" then printf("%.3f\n" num)  else printf("%.5f\n" num) )
作者: leilei4908    时间: 2021-1-26 14:01
jet2001 发表于 2021-1-26 13:15
_unit=car(axlDBGetDesignUnits())
num=1/3.0
if(_unit=="mils" then printf("%.2f\n" num)  else printf ...

我是想着,能否类似下面这种写法(当然下面的语法是错误的)

decimal_places = cadr(axlDBGetDesignUnits())

fprintf(f "%.%nf" decimal_places num)

用这种方式,fprintf输出的位数,也可以作为一个参数


作者: jet2001    时间: 2021-1-26 15:15
這我早上有試過 可能高手才改的出來
如果是我 我會用如上最笨的指令去寫, 把多數時間用在new-skill 更強的功能
作者: jet2001    时间: 2021-1-26 15:30
本帖最后由 jet2001 于 2021-1-26 15:35 编辑

請試
decimal_places = cadr(axlDBGetDesignUnits()) ;4
num=1/3.0
sprintf(tmpstr "%%.%df" decimal_places) ;"%.4f"
printf(tmpstr num)   ; 0.3333

decimal_places=2
sprintf(tmpstr "%%.%df" decimal_places) ;"%.2f"
printf(tmpstr num)   ; 0.33
想增加精密度1位 , 可以 sprintf(tmpstr "%%.%df" decimal_places+1 )

作者: leilei4908    时间: 2021-1-26 15:44
jet2001 发表于 2021-1-26 15:15
這我早上有試過 可能高手才改的出來
如果是我 我會用如上最笨的指令去寫, 把多數時間用在new-skill 更強的 ...

当然,特殊的方式是,另外写一个程序,比如
procedure(fpf(f num dec)
prog(()
        unless(portp(f) return(nil))
        case(dec
                (1
                        fprintf(f "%.1f" num)
                )
                (2
                        fprintf(f "%.2f" num)
                )
                (3
                        fprintf(f "%.3f" num)
                )
                (4
                        fprintf(f "%.4f" num)
                )
                (5
                        fprintf(f "%.5f" num)
                )
                (6
                        fprintf(f "%.6f" num)
                )
        )
))

就是比较局限性了
还不如把num,用
num = round(num * expt(10.0 dec)) / expt(10.0 dec)
处理下小数位

作者: deargds    时间: 2021-1-27 17:27
leilei4908 发表于 2021-1-26 15:44
当然,特殊的方式是,另外写一个程序,比如
procedure(fpf(f num dec)
prog(()
  1. fprintf(port sprintf(nil "%%.%df" cadr(axlDBGetDesignUnits())) fNumber))
  2. or
  3. fprintf(port "%L" fNumber))
复制代码








欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2