所以:
//aValue = 4.45
//bValue = 4.35
//maxValueDiff = 0.1
//The absolute value of a - b = 0.1
if( Math.abs(aValue - bValue) <= maxValueDiff ) return true;
logger.info("valueDiffCheck a:" + aValue +" b:"+ bValue + " e1:" + maxValueDiff);
为什么我会在日志中看到此内容:
valueDiffCheck a:4.45 b:4.35 e1:0.1
怀疑这是因为 Double 是一种双重痛苦,它不准确,但如果是这样的话,我不应该看到吗?就像它应该打印出 0.1 实际上是 0.10000000111 之类的? ...或者打印格式有什么令人讨厌的地方?
目标代码具有大量数据的高性能,因此我们不想使用 BigDecimal。确保 0.44 是 0.44 的下一个最佳方法是什么?
好吧,让我明确指出,我们只需要两位小数。使用 BigDecimal 所涉及的准确性是严重的矫枉过正。
最佳答案
我通过在可能出现问题的地方使用误差范围来解决这个问题。以下是一种非常简单的方法 - 但不一定是最好的方法(您可能希望它更加集中、可配置等) - 修改代码来执行此操作:
private static final double ERROR = 1e-7;
// SNIP
if( Math.abs(aValue - bValue) <= maxValueDiff + ERROR) return true;
logger.info("valueDiffCheck a:" + aValue +" b:"+ bValue + " e1:" + maxValueDiff);
关于Java Double Trouble - 如何在不使用 BigDecimal 的情况下确保 4.45 是 4.45?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26430189/