2016-07-05 5 views
1

Я делаю простое добавление/подстановку в PHP и возвращает неверный результат. В моей системе (PHP 5.3) это воспроизводимо:Добавление десятичного числа PHP приводит к странному результату

$number = 34706; 
$number2 = $number/100; 

// returns: number2: 347.06 
print "number2: $number2<br>"; 

$number3 = -347; 

$result = $number2 + $number3; 

// returns: "Result: 0.060000000000002 
print "Result: $result"; 

Я искал уже интернет. Является ли это представлением общей арифметической ошибки с плавающей запятой, описанной здесь ?: http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

Я знаю, как справиться с этим, поскольку я рассчитываю деньги, я могу использовать round() для каждого вычисления, чтобы вернуть только два десятичных знака значения.

Но все же я удивляюсь, почему я должен иметь дело с этим, и он не рассматривается на уровне языка программирования или выше. Нет никакого способа, приведенный выше результат может когда-либо быть полезным кому-то.

+1

yep ... с плавающей запятой округление! а не самой php, но универсальной с цифровыми компьютерами. Чем больше бит процессор, тем больше нулей вы получите в .060000000000000000002', но вы получите последнюю цифру почти каждый раз. – YvesLeBorg

ответ

1

Это верно, это ошибка с плавающей запятой, о которой вы упомянули. Если вы работаете с деньгами, а не постоянно округляетесь, посмотрите на функции bcmath.

http://php.net/manual/en/book.bc.php

0

Но все-таки интересно, почему мне приходится иметь дело с ним, и он не рассматривается на уровне языка программирования или выше. Нет никакого способа, приведенный выше результат может когда-либо быть полезным кому-то.

Дело в том, что на уровне машины нет десятичных чисел. ПК знает только целые числа как количество бит. Вы можете добавить и вычесть их и прочее, но никогда не может быть 0,anything бит. Чтобы получить десятичный номер, компьютер вычисляет его с помощью мантиссы и базы. Это всегда инакурат, и вы всегда будете немного.

Есть два способа справиться с этим:
1) Определите, насколько далеко вы спите, и немного вырезаете. В вашем случае 0.060000000000002 вы можете просто отрезать его после 10 цифр после запятой, и у вас будет номер в ядре.
2) Не используйте поплавки, если вы не можете жить с неработоспособностью. Переместитесь в область, где вам не нужно десятичное число, путем многократного повторения с 10 достаточно часто и снова делятся позже, когда вы получили свой результат.

 Смежные вопросы

  • Нет связанных вопросов^_^