BigDecimal的DoubleValue输出错误



使用java 11和Intellij Idea

我在这种情况下,我从外部系统得到一串数据,需要重新格式化。在当前的设置中,我用这一行来提取销售价格的值:

BigDecimal sellingPrice = BigDecimal.valueOf(Double.parseDouble(somesalesprice));

根据调试器,sellingPrice = " 4350000000 "现在,当我根据这行代码转换它时:

long roundedSellingPrice = (long) (sellingPrice.doubleValue() * 100);

结果是"434"。可以看到,1(美分)神奇地消失了。我仔细检查了数值,这是一致的。在我正在使用的500多个数据集中,大约。其他40张唱片似乎也有这个问题。对大多数人来说,情况似乎还不错。

我找不到这些记录之间的任何共同之处。

而且,结果总是四舍五入1美分,从不向上。

想知道这是什么吗?

听起来很奇怪,对于FloatDouble类型的数据,精度不是很好。所有的计算都使用BigDecimal。这是简短的回答。

此外,当您将String解析为任何数值类型时,您必须处理异常。有时说得通,有时说不通。对于不关心异常的情况,我编写了一个实用程序,可以将字符串解析为任何数值,如果解析失败,则返回默认值。如果您希望将异常消息打印到日志中,同一实用程序可以选择将异常消息打印到日志中。参见method:
public static java.math.BigDecimalparseStringToBigDecimal(java.lang. lang.)CharSequence num, java.math.BigDecimal defaultValue)

public static java.math.BigDecimal parseStringToBigDecimal(java.lang. bigdecimal)CharSequence进行num,java.math.BigDecimal defaultValue,以nullOrEmptyStringErrorMessage,string numberFormatErrorMessage)
这些方法非常有用。该实用程序是由我编写和维护的开源MgntUtils库附带的。您可以通过maven工件或Github

获得它。

最新更新