【问题标题】:Why is (327.59 * 100.0) < 32759.0 true? [duplicate]为什么 (327.59 * 100.0) < 32759.0 为真? [复制]
【发布时间】:2015-11-11 19:58:57
【问题描述】:

乘法

(327.59 * 100.0) 

产生一个小于 32759 的数字,这是为什么呢?又该如何避免呢?

【问题讨论】:

  • 浮点值是这样工作的。为避免这种情况,请使用 decimal
  • double 本质上是一个二进制数。正因为如此,它不能完全代表327.59,而是你得到了接近它的东西。正如@Petr 所说,使用decimal 来避免这种情况。 decimal 使用以 10 为底,因此 327.59 可以精确表示。供参考; Kahan 建议英特尔在 70 年代使用十进制表示浮点数。改变为时已晚,40 年后我们一次又一次地付出代价

标签: f# floating-point


【解决方案1】:

使用经过修改的 F# Interactive 漂亮打印机,可以完全显示数字精度。

fsi.AddPrinter( fun (x:float) -> sprintf "%26.16e" x)

(327.59 * 100.0)
// val it : float =    3.2758999999999996e+004

32759.0
// val it : float =    3.2759000000000000e+004

这就是为什么

(327.59 * 100.0) < 32759.0 = true

【讨论】:

  • 谢谢,printf "%f" 隐藏了它
猜你喜欢
  • 2017-04-28
  • 1970-01-01
  • 1970-01-01
  • 2018-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-04
  • 2015-05-09
相关资源
最近更新 更多