繁体   English   中英

BigDecimal 的 DoubleValue 提供错误 output

[英]DoubleValue of BigDecimal provided wrong output

使用 java 11 和 Intellij Idea。

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

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

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

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

结果是“434”。 可以看出,1(分)神奇地消失了。 我仔细检查了值和这个一致。 在我使用的 500 多个数据集中,大约有其他 40 条记录似乎有此问题。 对于大多数人来说,它似乎进展顺利。

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

此外,事实证明,结果总是向下舍入 1 美分,从不向上舍入。

想知道这可能是什么?

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

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

公共 static java.math.BigDecimal parseStringToBigDecimal(java.lang.CharSequence num, java.math.BigDecimal defaultValue, java.lang.String nullOrEmptyStringErrorFormMessageString8, 8692153
这些方法可能非常有用。 该实用程序附带由我编写和维护的开源 MgntUtils 库。 您可以通过maven artifactsGithub获得它

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM