度量单位 API (JSR-363) - 浮点错误

Unit Of Measures API (JSR-363) - Floating Point Errors

我们使用 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 值,并且在转换值时会丢失精度。我们需要 round/introduce 该值的比例,这并不理想。

这里有什么明显的错误吗?我是否错过了一些使用 API 的方式来保持精度,或者所有转换都路由到 Double 值并且将失去精度,无论我做什么?

问了这个问题后进一步搜索,我意识到我们为我们的应用程序使用了错误的库。 unit-ri is meant for Java ME and uses double internally, uom-se 适用于 Java SE 并使用 BigDecimal。这解决了我们的问题。