Java Double Trouble - 如何在不使用 BigDecimal 的情况下确保 4.45 是 4.45?

标签 java double rounding truncate

所以:

//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/

相关文章:

java - 正确地转换泛型

java - 使用 MySQL 的 DataJpaTest 存储库测试,Hibernate 不会将用户设置为在 H2 DB 中自动递增

java - 解析和替换 Java 字符串中的 double

c - 如何获得 10 次方的 double 的尾数和指数?

excel - 显示 1/8 英寸的 VBA 用户定义函数显示空白

math - 避免指数计算中的舍入误差

java - 注释是 Java 中的某种 DSL 吗?

java - 如何检查一个数字是否可以被两个不同的值整除?

mysql - 存储在 MySQL 中的浮点值不断变得困惑

c - 使用 fscanf 确定您正在读取 int 还是 double