找回密码
 注册
关于网站域名变更的通知
查看: 1155|回复: 9
打印 上一主题 下一主题

[求助] fprintf 怎么输出自动判断小数位的小数?

[复制链接]
  • TA的每日心情
    开心
    2022-5-6 15:29
  • 签到天数: 34 天

    [LV.5]常住居民I

    跳转到指定楼层
    1#
    发表于 2021-1-22 12:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    EDA365欢迎您登录!

    您需要 登录 才可以下载或查看,没有帐号?注册

    x
    比如,
    decimal_places = cadr(axlDBGetDesignUnits())
    可以获取当前design的小数位
    但是常规输出到文件
    fprintf(f "%.2f/n" num)
    这里的 %.2f 是在写代码的时候就定好的
    如果遇到小数位不同的情况
    怎么让程序自动判断,并且输出相应位数的小数呢

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

    有没有更好的方法呢

    该用户从未签到

    推荐
    发表于 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))
    复制代码



  • TA的每日心情
    开心
    2019-11-19 15:32
  • 签到天数: 1 天

    [LV.1]初来乍到

    推荐
    发表于 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 )
  • TA的每日心情
    慵懒
    2020-8-28 15:16
  • 签到天数: 1 天

    [LV.1]初来乍到

    4#
    发表于 2021-1-22 13:31 | 只看该作者
    帮你顶一下吧
  • TA的每日心情
    开心
    2019-11-19 15:32
  • 签到天数: 1 天

    [LV.1]初来乍到

    5#
    发表于 2021-1-22 13:51 | 只看该作者
    既然是 float 那小數點有幾位 應該是未知的

    我的做法是看 brd 或 dra 的單位是用那一種?
    unit是millimeters時 小數點我最少會取4位 或5位
    unit是mils時 小數點我最少會取2位 或3位

    点评

    decimal_places = cadr(axlDBGetDesignUnits()) 虽然能获取到当前设计的精度,但事实上,这个只是显示的数值,而不是真实的数值 真正获取到的,比如Cline的长度,根本不是通过查询显示的数值,所以还需要小数位转  详情 回复 发表于 2021-1-25 17:05
  • TA的每日心情
    开心
    2022-5-6 15:29
  • 签到天数: 34 天

    [LV.5]常住居民I

    6#
     楼主| 发表于 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
    能否自动判断小数位呢?
  • TA的每日心情
    开心
    2019-11-19 15:32
  • 签到天数: 1 天

    [LV.1]初来乍到

    7#
    发表于 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) )

    点评

    我是想着,能否类似下面这种写法(当然下面的语法是错误的)decimal_places = cadr(axlDBGetDesignUnits()) fprintf(f "%.%nf" decimal_places num) 用这种方式,fprintf输出的位数,也可以作为一个参数  详情 回复 发表于 2021-1-26 14:01
  • TA的每日心情
    开心
    2022-5-6 15:29
  • 签到天数: 34 天

    [LV.5]常住居民I

    8#
     楼主| 发表于 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输出的位数,也可以作为一个参数

  • TA的每日心情
    开心
    2019-11-19 15:32
  • 签到天数: 1 天

    [LV.1]初来乍到

    9#
    发表于 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  详情 回复 发表于 2021-1-26 15:44
  • TA的每日心情
    开心
    2022-5-6 15:29
  • 签到天数: 34 天

    [LV.5]常住居民I

    10#
     楼主| 发表于 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)
    处理下小数位
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-11-22 06:27 , Processed in 0.156250 second(s), 25 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表