【发布时间】:2016-07-25 19:10:02
【问题描述】:
有什么办法可以确保用户输入的浮点变量,小数点后有 2 位小数,保持其精确值,而不是失去精度?
这是一个例子:
我想在小数点后用 50 个数字四舍五入 float,像这样
四舍五入前 =
0.70999997854232788085937500000000000000000000000000
到这里:
四舍五入后 =
0.71000000000000000000000000000000000000000000000000
当我想在这样的条件下比较 float 号码时,我感到困惑:
== 程序开始==
输入:0.71
/* program logic */
if (input == 0.71) {
printf("True !");
} else {
printf("False !");
}
输出:错误!
==程序结束==
输出是False !,并且永远是False !,因为用户输入的真实值是0.70999997854232788085937500000000000000000000000000,而不是0.71000000000000000000000000000000000000000000000000
有没有办法像这样对float 值进行舍入?我在这里读到了浮点数不准确的可能性:
- Why Are Floating Point Numbers Inaccurate?
- 并跟随它到这些链接:Is there a function to round a float in C or do I need to write my own?
- 和Rounding Number to 2 Decimal Places in C
但是,这些并不能回答我的问题。如果我使用ceilf(input * 100) / 100 函数,当printf()d 使用%.5f 格式时,它将使输入0.71 变为0.71000 - 这似乎有效。但是当我使用%.50f 打印时,实际输入值显示为0.709999978542327880859375。所以,在我的情况下,我无法与那个值进行比较。
那么,如果浮点数永远不可能准确,那么上面的程序逻辑在该条件下获得true 返回值的技巧是什么?
【问题讨论】:
-
您可以安全地从问题中删除所有这些尾随零。除了使问题变得混乱之外,他们什么都不提供。
-
一个
float的值甚至不能保留50位小数:double只能保留大约16位。请read this。 -
Rounding Number to 2 Decimal Places in C - 你提到了这个和其他保证的重复,但没有解释你为什么忽略它们,即为什么你认为他们没有解决这个问题。跨度>
-
无论如何,浮点是总是准确到特定范围;对于所有数字,它并不总是精确。这些都是定义明确的概念。
标签: c floating-point rounding