使用java 11和Intellij Idea
我在这种情况下,我从外部系统得到一串数据,需要重新格式化。在当前的设置中,我用这一行来提取销售价格的值:
BigDecimal sellingPrice = BigDecimal.valueOf(Double.parseDouble(somesalesprice));
根据调试器,sellingPrice = " 4350000000 "现在,当我根据这行代码转换它时:
long roundedSellingPrice = (long) (sellingPrice.doubleValue() * 100);
结果是"434"。可以看到,1(美分)神奇地消失了。我仔细检查了数值,这是一致的。在我正在使用的500多个数据集中,大约。其他40张唱片似乎也有这个问题。对大多数人来说,情况似乎还不错。
我找不到这些记录之间的任何共同之处。
而且,结果总是四舍五入1美分,从不向上。
想知道这是什么吗?
听起来很奇怪,对于Float
和Double
类型的数据,精度不是很好。所有的计算都使用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