Магия числа 4.02

it75

Наткнулся на проблему с числом 4.02!

Код (Text):
  1. $lenMetr = 4.020;
  2. $lenMilimetr = (int) ($lenMetr * 1000);
  3. var_dump($lenMilimetr);

В результате получаю: int(4019)
Куда пропадает 1 при приведении типа, не могу понять? Это только у меня или нет?

 

mkramer

Компьютеры считают в двоичной системе, мы в десятичной. В двоичной другие периодические дроби и иррациональные числа. Отсюда такие фокусы с численной арифметикой вещественных чисел. Там, где совсем критична такая ситуация, используют расширения типа bcmath, они считают точно, но медленно, поскольку это, грубо говоря, запрограммированные операции столбиком. Там числа представляются как строки.

 

it75

Готов был увидеть погрешность в дробной части, но ни как ни в целой.

 

mkramer

Ну так вы дробную обрезаете. Там скорее всего что-то типа 4019.999999998 если вывести без (int).

А вполне даже возможно, что без (int) этой ошибки не будет заметно

 

it75

Верно, не будет заметно!
И это мысль!

Код (Text):
  1. $lenMilimetr = (int) bcmul($lenMetr, 1000);

работает медленнее чем:

Код (Text):
  1. $lenMilimetr = (int) ((string) ($lenMetr * 1000));
 

mkramer

Это какая-то бессмыслица

Уберите преобразование в int и радуйтесь. У вас явно не задача, требующая сверхточных вычислений. Или используйте округление до целых, всё равно вы дробную часть отсекаете. round()
— Добавлено —
Забавы ради:
http://sandbox.onlinephpfunctions.com/code/9a17658f88dbfd537c4585196b0ec9f0b5846369

 

artoodetoo

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *