我们使用 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
无论我做什么,所有转换都通过值路由并且会丢失精度?