c语言中关于宽度和精度,保持浮点值精度的Printf宽度说明符

276b4ce13c8d17812355e65b1e19850c.png

慕桂英546537

十六进制解决方案:使用%a。OP想要“具有最大精度的打印(或至少到最重要的十进制)”。一个简单的例子是打印七分之一,如下所示:#include int Digs = DECIMAL_DIG;double OneSeventh = 1.0/7.0;printf("%.*e\n", Digs, OneSeventh);// 1.428571428571428492127e-01但让我们深入挖掘.。数学上,答案是“0.142857 142857 142857.”,但我们使用的是有限精度浮点数。让我们假设IEEE 754双精度二进制..所以OneSeventh = 1.0/7.0结果如下所示。还显示了前面和下面的可表示double浮点数。OneSeventh before = 0.1428571428571428 214571170656199683435261249542236328125OneSeventh        

= 0.1428571428571428 49212692681248881854116916656494140625OneSeventh after  = 0.1428571428571428 769682682968777953647077083587646484375打印精确性的十进制表示double用途有限。C中有两个宏家族。帮助我们。第一组是显着用十进制字串打印的数字,所以当扫描返回字符串时,我们得到原始浮点数。这里显示的是C规范最小值价值和a样本c11编译器FLT_DECIMAL_DIG   6,  9 (float)                           (C11)DBL_DECIMAL_DIG  10, 17 (double)                    

      (C11)LDBL_DECIMAL_DIG 10, 21 (long double)                     (C11)DECIMAL_DIG      

      10, 21 (widest supported floating type)  (C99)第二组是显着数字字符串可以扫描成浮点,然后打印FP,仍然保留相同的字符串表示形式。这里显示的是C规范最小值价值和a样本c11编译器我相信在C99之前就有了。FLT_DIG   6, 6 (float)DBL_DIG  10, 15 (double)LDBL_DIG 10, 18 (long double)第一组宏似乎符合OP的目标显着数字。但那宏并不总是可用的。#ifdef DBL_DECIMAL_DIG  #define OP_DBL_Digs (DBL_DECIMAL_DIG)#else  

  #ifdef DECIMAL_DIG    #define OP_DBL_Digs (DECIMAL_DIG)

  #else  

    #define OP_DBL_Digs (DBL_DIG + 3)

  #endif#endif“+3”是我先前回答的关键。如果知道往返转换字符串-fp-string(SET#2宏可用C89),那么如何确定fp-string-fp(SET#1宏可用后C89)的数字?总的来说,Add 3就是结果。现在有多少显着要打印的数字是已知的,并通过.打印N显着十进制数字可以使用各种格式。带着"%e",精密度字段是数字的数目。后领头数字和小数点。所以- 1是合乎情理的。注:此-1 is not in the initialINDIG=十进制_DIG;printf("%.*e\n", OP_DBL_Digs - 1, OneSeventh);// 1.4285714285714285e-01带着"%f",精密度字段是数字的数目。后小数点。像这样的数字OneSeventh/1000000.0,一个人需要OP_DBL_Digs + 6去看所有的显着数字。printf("%.*f\n", OP_DBL_Digs    , OneSeventh);// 0.14285714285714285printf("%.*f\n", OP_DBL_Digs + 6, OneSeventh/1000000.0);

// 0.00000014285714285714285注:许多人习惯于"%f"..它在小数点之后显示6位数字;6是显示默认值,而不是数字的精度。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值