Мы используем 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
и будут терять точность, независимо от того, что я делаю?