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

时间:2018-10-24 08:17:59

标签: java unit-conversion jsr363

我们使用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值进行路由,而无论我做什么都会丢失精度?

1 个答案:

答案 0 :(得分:1)

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