繁体   English   中英

C:舍入浮点数

[英]C: Rounding floats

你能解释一下这段代码吗:

  printf("Value1: %0.1f \n", (float)124/100); // = 1.2
  printf("Value1: %0.1f \n", (float)125/100); // = 1.2
  printf("Value1: %0.1f \n", (float)126/100); // = 1.3
  printf("\n");
  printf("Value2: %0.1f \n", (float)134/100); // = 1.3
  printf("Value2: %0.1f \n", (float)135/100); // = 1.4
  printf("Value2: %0.1f \n", (float)136/100); // = 1.4

为什么数字 125向下舍入为 1.2 而 135向上舍入为 1.4? 例如,它也会发生在数字 105、115、125、155、165 上。

C 标准没有完全指定float格式或如何执行舍入。 今天大多数 C 实现都使用 IEEE-754 binary32 格式来表示float 在这种格式中:

  • 最接近 1.24 的可表示值为 1.2400000095367431640625。
  • 最接近 1.25 的可表示值为 1.25。
  • 最接近 1.26 的可表示值为 1.2599999904632568359375。
  • 最接近 1.34 的可表示值为 1.34000003337860107421875。
  • 最接近 1.35 的可表示值为 1.35000002384185791015625。
  • 最接近 1.36 的可表示值为 1.36000001430511474609375。

如果您将printf调用中的%0.1f更改为%.99g .99g ,您的 C 实现可能会向您显示这些值。

最常用的舍入规则是舍入到最接近的可表示值,如果出现平局,则舍入到具有更低数字的平局值。 这是几乎总是用于算术运算(尤其是加法、减法、乘法和除法)的规则,因此您的 C 实现可能在计算(float)124/100等时使用它。

在将数字从内部二进制float格式转换为字符串中的数字时,也经常使用该规则,例如printf (在这种情况下,该规则的使用频率较低,因为某些转换软件未编写为使用根据此规则始终产生正确结果所需的精度或计算。)您观察到的 output 与此规则的使用一致:

  • 将 1.2400000095367431640625 四舍五入到小数点后一位得到“1.2”,因为它更接近 1.2 而不是 1.3。
  • 将 1.25 四舍五入到小数点后的一位数字会产生“1.2”,因为 1.2 和 1.3 是并列的,而 1.2 具有偶数位。
  • 将 1.2599999904632568359375 四舍五入到小数点后一位数得到“1.3”,因为它更接近 1.3 而不是 1.2。
  • 将 1.34000003337860107421875 四舍五入到小数点后一位得到“1.3”,因为它更接近 1.3 而不是 1.4。
  • 将 1.35000002384185791015625 四舍五入到小数点后一位得到“1.4”,因为它更接近 1.4 而不是 1.3。
  • 将 1.36000001430511474609375 四舍五入到小数点后一位数得到“1.4”,因为它更接近 1.4 而不是 1.3。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM