Why/when 使用浮点数而不是 BigDecimal
Why/when to use floats instead of BigDecimal
这可能是一个幼稚或沉重的问题,但在调试浮点数问题后,我有一个问题要问:
如果由于 float 和 bigdecimals 之间以 2 为基数与以 10 为基数的表示差异而导致 float 存在舍入问题……why/when 你会使用 float 还是 bigdecimals?
几乎所有主要的编程语言都有一个 BigDecimal 库...所以
在我看来,数学的准确性胜过使用浮点数带来的任何性能提升……所以为什么软件世界不放弃浮点数并说,“对不起,我们要走了全押 BigDecimal”?
假设您正在收集大量测量数据。您知道您的传感器已经为您提供了 5% 的错误率。为什么要花费 大量 额外的计算能力来实现对该数据的 100% 正确计算?!并且可以说,我们不是在谈论 10 MB 的数据;但 10 TB。或拍字节。您是否仍然相信使用 BigDecimal 来处理该数据是值得的?
换句话说:在很多情况下,您绝对不需要 100% 的正确性。然后你不愿意支付与那 100% 相关的价格标签。
我完全同意:例如,一旦我们谈论代表 货币 的数字,我们就会尽我们所能避免舍入误差。但我们根本不需要对所有数据都一视同仁。因为在现实世界中,有很多不同的要求;好的工程就是选择能够在给定 约束条件 .
的情况下提供最佳解决方案的工具
关键问题是您的应用程序是否会受益于终止小数的精确表示。
能够准确表示 1.01 等数字在财务计算中非常非常有用。
另一方面,当您处理物理测量时,小数结果本身只是一个近似值。我不相信任何物理量的测量精度都达到 IEEE 754 64 位浮点数,最常见的双精度实现。
有一种误解认为 BigDecimal 库消除了舍入问题。它们只对可以精确表示为相当短的小数部分的数字有所帮助。 BigDecimal 在表示三分之一时并不比 double 好。
这可能是一个幼稚或沉重的问题,但在调试浮点数问题后,我有一个问题要问:
如果由于 float 和 bigdecimals 之间以 2 为基数与以 10 为基数的表示差异而导致 float 存在舍入问题……why/when 你会使用 float 还是 bigdecimals?
几乎所有主要的编程语言都有一个 BigDecimal 库...所以
在我看来,数学的准确性胜过使用浮点数带来的任何性能提升……所以为什么软件世界不放弃浮点数并说,“对不起,我们要走了全押 BigDecimal”?
假设您正在收集大量测量数据。您知道您的传感器已经为您提供了 5% 的错误率。为什么要花费 大量 额外的计算能力来实现对该数据的 100% 正确计算?!并且可以说,我们不是在谈论 10 MB 的数据;但 10 TB。或拍字节。您是否仍然相信使用 BigDecimal 来处理该数据是值得的?
换句话说:在很多情况下,您绝对不需要 100% 的正确性。然后你不愿意支付与那 100% 相关的价格标签。
我完全同意:例如,一旦我们谈论代表 货币 的数字,我们就会尽我们所能避免舍入误差。但我们根本不需要对所有数据都一视同仁。因为在现实世界中,有很多不同的要求;好的工程就是选择能够在给定 约束条件 .
的情况下提供最佳解决方案的工具关键问题是您的应用程序是否会受益于终止小数的精确表示。
能够准确表示 1.01 等数字在财务计算中非常非常有用。
另一方面,当您处理物理测量时,小数结果本身只是一个近似值。我不相信任何物理量的测量精度都达到 IEEE 754 64 位浮点数,最常见的双精度实现。
有一种误解认为 BigDecimal 库消除了舍入问题。它们只对可以精确表示为相当短的小数部分的数字有所帮助。 BigDecimal 在表示三分之一时并不比 double 好。