度量单位 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
值并且将失去精度,无论我做什么?
我们使用 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
值并且将失去精度,无论我做什么?