1

我们使用 tec.units.unit-ri 作为 JSR-363 javax.measure.unit-api 的实现。

我们在我们的应用程序中使用了几种重量、长度和温度类型,我们决定使用 BigDecimal 来存储它们。在进行一些转换时,我意识到我们的实例中出现了浮点错误。

Unit<Length> metres = Units.METRE;
Unit<Length> centimetres = Units.METRE.divide(100);
BigDecimal valueInCentimetres = new BigDecimal("10.1");
Quantity<Length> valueInMetres = Quantities.getQuantity(valueInCentimetres, centimetres).to(metres) ;

如果我运行此代码,则该变量valueInMetres包含一个Double带有浮点错误的表示形式,即 0.10099999999999999 m。该实现在内部使用double值,并且在转换值时会丢失精度。我们需要对值进行舍入/引入比例,这并不理想。

有什么明显的我做错了吗?我是否错过了某种使我能够保持精度的 API 的使用方式,或者Double无论我做什么,所有转换都通过值路由并且会丢失精度?

4

1 回答 1

1

在提出这个问题后进一步搜索,我意识到我们为我们的应用程序使用了错误的库。unit-ri用于 Java ME 并在内部使用 double,uom-se用于 Java SE 并使用 BigDecimal。这解决了我们的问题。

于 2018-10-24T08:44:54.523 回答