it75
Наткнулся на проблему с числом 4.02!
Код (Text):
$lenMetr = 4.020; $lenMilimetr = (int) ($lenMetr * 1000); var_dump($lenMilimetr);В результате получаю: int(4019)
Куда пропадает 1 при приведении типа, не могу понять? Это только у меня или нет?
mkramer
Компьютеры считают в двоичной системе, мы в десятичной. В двоичной другие периодические дроби и иррациональные числа. Отсюда такие фокусы с численной арифметикой вещественных чисел. Там, где совсем критична такая ситуация, используют расширения типа bcmath, они считают точно, но медленно, поскольку это, грубо говоря, запрограммированные операции столбиком. Там числа представляются как строки.
it75
Готов был увидеть погрешность в дробной части, но ни как ни в целой.
mkramer
Ну так вы дробную обрезаете. Там скорее всего что-то типа 4019.999999998 если вывести без (int).
А вполне даже возможно, что без (int) этой ошибки не будет заметно
it75
Верно, не будет заметно!
И это мысль!Код (Text):
$lenMilimetr = (int) bcmul($lenMetr, 1000);работает медленнее чем:
Код (Text):
$lenMilimetr = (int) ((string) ($lenMetr * 1000));
mkramer
Это какая-то бессмыслица
Уберите преобразование в int и радуйтесь. У вас явно не задача, требующая сверхточных вычислений. Или используйте округление до целых, всё равно вы дробную часть отсекаете. round()
— Добавлено —
Забавы ради:
http://sandbox.onlinephpfunctions.com/code/9a17658f88dbfd537c4585196b0ec9f0b5846369
artoodetoo
моё любимое: http://sandbox.onlinephpfunctions.com/code/7e4261a2b1aaddbac423ebe98e3264e43df8f4ad
var_dump(0.1 + 0.7 == 0.8); // выведет «bool(false)»
обычная ошибка новичка: начинает кругом втыкать round(). но т.к. round внезапно™ возвращает вещественное число, то «ошибки» вполне могут вылезти снова.