Как умножить удвоения без потери точности? - PullRequest
0 голосов
/ 05 февраля 2020

С учетом этой функции:

fun  multiplyByHundred(num:Double):Double{
    return num * 100
}

Это результаты для некоторых входных данных:

69.56 => 6956.0

69.57 => 6956.999999999999

69.58 => 6958.0

69.59 => 6959.0

  1. Почему 69.57 приводит к 6956.999999999999?
  2. Как правильно выполнить этот расчет без потери точности и заставить его работать с любой двухместный?

1 Ответ

2 голосов
/ 05 февраля 2020

Вы не можете. double может представлять только разреженное подмножество действительных чисел. Возможно, вам не удастся использовать double, если вы можете соответствующим образом отформатировать вывод (что, по сути, делает Microsoft Excel, вместе с некоторыми очень умными приемами для выражений, таких как 1/3 + 1/3 + 1/3).

Если вам нужна идеальная точность, используйте тип, способный сделать это. Десятичный тип BigDecimal - это, вероятно, то, что вы хотите.

Если вы работаете с деньгами, и вам не нужно беспокоиться о валютах с тысячами (например, тунисский динар) или bitcoin (8 десятичных знаков) мест), то работа в центах и ​​использование целых чисел является одним из подходов.

...