2016-03-11 3 views
0

Это очень простая проблема для дублирования. Я делаю простое вычитание с использованием чисел с плавающей запятой. Как видно из приведенного ниже кода и соответствующего вывода, расчет неверен.Проблема вычитания с плавающей запятой в PHP

(PHP 5.6.6 на OSX El Capitan)

<?php 

    $bal = 20017.1; 
    $amt = 20000; 
    $newbal = $bal - $amt; 

    print_r(compact('bal', 'amt', 'newbal')); 
    echo "\n"; 

Как вы можете видеть из этого вывода, $ newbal не является правильным.

Array 
(
    [bal] => 20017.1 
    [amt] => 20000 
    [newbal] => 17.099999999999 
) 

ответ

3

Для объяснения того, почему это происходит, смотрите здесь:

http://floating-point-gui.de/

Если вы заранее знаете, точность вам нужно, один простое решение заключается в использовании bcsub() метод:

$bal = 20017.1; 
$amt = 20000; 
$newbal = bcsub($bal,$amt,1); // 17.1 

Рабочий пример: https://3v4l.org/PZ4qS

0

Вам нужно использовать функции для получения точных результатов с номерами с плавающей запятой в PHP. Попробуйте использовать http://de2.php.net/manual/en/ref.bc.php, в частности функцию bcsub, и явным образом расскажу, сколько десятичных точек точности вы хотите.