【问题标题】:How to round display of float such that last two digits are always "00"?如何舍入浮点数的显示以使最后两位数字始终为“00”?
【发布时间】:2013-01-31 04:57:50
【问题描述】:

我需要用 C 编写一个程序来执行以下操作:

编写一个程序,当用户输入一个浮点数时,它会将数字四舍五入到小数点后 3 位。显示结果时,显示小数点后 5 位,即小数点后第 4 位和第 5 位均为 0。

如何将其四舍五入到小数点后 3 位,然后显示两个零?我不允许使用任何类型的数学库函数。

【问题讨论】:

  • 我试过 (number*1000 + .0005) / 1000;
  • 您可能希望删除 .0005 上的一些小数位(如 所有 个)
  • 是否需要处理负数?

标签: c numbers rounding


【解决方案1】:
printf("%.5f\n",(int)(number*1000+0.5)/1000.0);

【讨论】:

  • 这实际上不会这样做;在某些极端情况下会打印错误的内容。
  • @R..:你说的是数字溢出整数的情况吗?
  • 这只是一种情况。您还知道乘以 1000 是有损运算,因为 1000 不是 2 的幂。也许还有其他问题。
  • 基本上,归结为没有简单的方法可以使用浮点数学将浮点值四舍五入到“N 个小数位”,因为浮点数不是十进制而是二进制。 pst 的答案是正确的,因为printf 系列是标准库中唯一 可以对浮点数进行十进制舍入的工具,而对浮点数进行十进制舍入已经够难了你不想自己尝试。
  • 试试0x1.e84801f9db22dp+20,它是最接近 2000000.1235000001 的双精度数,但在数值上略小于 2000000.1235。它应该四舍五入为 2000000.123,但您的算法将其四舍五入为 2000000.124。这些只是我开始玩的一些随机测试用例;我相信你可以找到更多。
【解决方案2】:

好吧,“没有数学”方法:D

printf("%.3f00\n", n);

(通常以Round-to-Nearest-Even为准;见R..的评论。)

【讨论】:

  • 舍入不是特定于实现的,至少在支持 IEEE 算术的实现中不是。它匹配当前的舍入模式,默认情况下,舍入到最近(偶数)。
【解决方案3】:

您的任务有两个步骤:

1) 将数字四舍五入到小数点后三 (3) 位。

double n = 0.123456;
n = ((int) (n * 1000.0)) / 1000.0; // => 0.123

2) 将数字显示到小数点后五 (5) 位。

printf("%.5f\n", n); // => 0.12300

【讨论】:

  • 如果n 是 2^256 会怎样?
  • @R.. 将n 包装成负数的溢出。
  • 不。调用 UB 的溢出。对于 float 到 int 溢出,真正的 impl 不会换行。他们经常在溢出时给出 INT_MIN。
猜你喜欢
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多