【发布时间】:2021-02-13 00:45:21
【问题描述】:
我有一个从 PostGresql DB 读取数据的应用程序。该列定义为real。在 java 代码中,我将此列的值读取为BigDecimal。发生了什么,DB 中此列的值为0.18。当我读取这些数据时,java 输出显示为0.180000007。如果我在 java 中将列定义为Float,我得到的值为0.18。我没有在我的应用程序中进行任何货币计算。谁能解释一下为什么 BigDecimal 在小数点后显示这么多数字?
请参考下面的代码,我试图理解为什么 BigDecimal 在小数点后给出这么多数字:
公共类 BigDecimalTest {
public static void main(String[] args){
float float_val = 0.18f;
BigDecimal output = new BigDecimal(float_val);
System.out.println("BigDecimal output is: "+ output);
System.out.println("Float output is: "+float_val);
}
}
输出:
BigDecimal output is: 0.180000007152557373046875
Float output is: 0.18
【问题讨论】:
-
您应该阅读您正在使用的 BigDecimal 构造函数的 JavaDoc。它清楚地指出:“这个构造函数的结果可能有点不可预测。人们可能会假设在 Java 中编写 new BigDecimal(0.1) 会创建一个正好等于 0.1 的 BigDecimal(未缩放的值 1,缩放为1),但它实际上等于 0.1000000000000000055511151231257827021181583404541015625。这是因为 0.1 不能完全表示为双精度 (...)。因此,传递给构造函数的值并不完全等于 0.1,尽管看起来如此。 "
-
Yout float 具有完全相同的值。它只是打印不同。另见Is floating point math broken
标签: java floating-point bigdecimal