Существуют ли какие-либо предостережения от создания FastMoney/Money из двойника?
Я видел, что есть проблемы при создании BigDecimal
от double
,
Хотя FastMoney
не использует BigDecimal
(в отличие от Money
), Я не уверен, как будет вести себя любой из них, когда я double
значение.
Создает FastMoney
/Money
экземпляр из double
не рекомендуется? Должен ли я всегда пытаться создать их из String
?
1 ответ
double
и особенно float
типы опасны. Эти числа представляют собой систему счисления base-2, поэтому невозможно представить 0.24F
прямо как то же самое невозможно представить 1/3
в десятичной системе без повторяющегося десятичного периода, т.е. 1/3=0.3333...
или же 0.(3)
,
Так что число с плавающей точкой 0.24F
при печати обратно в десятичное представление отображается как 0.23
с изменением из-за округления:
println(0.24F) => 0.23999999463558197021484375
в то время как 0.25F
может быть показан непосредственно:
println(0.25F) => 0.25
Итак, отвечая на ваш вопрос: это зависит. Для 0.25, 0.5, 0.75 нормально использовать double.
Но класс FastMoney использует не арифметику с плавающей точкой, а арифметику с фиксированной точкой