Ошибка PHP, уменьшив переменные с реальной стоимостью

Прежде всего здесь будь почему:

https://stackoverflow.com / questions / 17210787/php-float-calculation-error-when-subtracting

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

// Da error al obtener $pdt
$total      = 12.86;
$total_pu   = 11.22;
$total_p    = 1.64;

$pdt = $total - ($total_pu + $total_p);

var_dump($total);
var_dump($total_pu);
var_dump($total_p);
var_dump($pdt);

/*
Respuesta:

float(12.86) 
float(11.22) 
float(1.64) 
float(-1.7763568394003E-15)
*/

$pdt дай как результат:-1.7763568394003E-15

Я перехожу, чтобы это упорядочивать таким образом:

// En este caso sí sale bien.
$total      = 12.86;
$total_pu   = 11.22;
$total_p    = 1.64;
$pagado = (real)number_format($total_pu + $total_p, 2);
$pdt = (real)number_format($total, 2) - (real)number_format($pagado, 2);

var_dump($total);
var_dump($total_pu);
var_dump($total_p);
var_dump($pagado);
var_dump($pdt);

/*
Respuesta:

float(12.86) 
float(11.22) 
float(1.64) 
float(12.86) 
float(0)
*/

Совсем правильный, вычитание дает нуль, который является правильным и логическим, но если я меняю стоимость:

// Pero si pongo otros importes ya vuelve a dar error:
$total      = 1194.17;
$total_pu   = 0;
$total_p    = 0;
$pagado = (real)number_format($total_pu + $total_p, 2);
$pdt = (real)number_format($total, 2) - (real)number_format($pagado, 2);

var_dump($total);
var_dump($total_pu);
var_dump($total_p);
var_dump($pagado);
var_dump($pdt);

/*
Respuesta:

float(1194.17) 
int(0) 
int(0) 
float(0) 
float(1)
*/

Оказывается, что 1194.17 меньше нуль ДАЕТ ОДИН!!!!

Эта проблема, серьезнее, чем я был похож, меня он имеет flipando в цветах и я закончился тревожно. Глупость также как и уменьшать два числа заставляет меня терять утро работы.

Он произошел с вами?

Как вы это решаете?

Это только, оставшись?

0
задан 23.12.2019, 17:21
2 ответа

Когда casteas string в один nГєmero, PHP пробегает string до того, чтобы находить первого carГЎcter не numГ©rico, despuГ©s, которого он не продолжает оценивать.

$total_string =number_format(1194.17, 2);
$total_casteado =(real) $total_string;

var_dump([
  '$total_string'=>$total_string,  // "1,194.17"
  '$total_casteado'=> $total_casteado, // 1 (se detiene en la coma)
   'cadena parcialmente numérica'=> (real) "-1.024A"  // -1.024

]);
2
ответ дан 23.12.2019, 22:06
  • 1
    Ты имеешь razó n, правильное состоит в том, чтобы использовать Round вместо Format_Number – Manu Burrero Sánchez 23.12.2019, 15:20
  • 2
    В действительности я trabajarí в с nú простые сигары и не с number format в операциях matemá костариканские. format делается só это для impresió n конец, если он состоит в том, что он требуется – amenadiel 23.12.2019, 15:21

SOLUCIГ–N:

В cГіdigo выставленный, изменитесь FORMAT_NUMBER из-за ROUND и функционируй:

// En este caso sí sale bien.
$total      = 12.86;
$total_pu   = 11.22;
$total_p    = 1.64;
$pagado = (real)round($total_pu + $total_p, 2);
$pdt = (real)round($total, 2) - (real)round($pagado, 2);

var_dump($total);
var_dump($total_pu);
var_dump($total_p);
var_dump($pagado);
var_dump($pdt);

И aquГ - tambiГ©n уже функционируй:

$total      = 1194.17;
$total_pu   = 0;
$total_p    = 0;
$pagado = (real)round($total_pu + $total_p, 2);
$pdt = (real)round($total, 2) - (real)round($pagado, 2);

var_dump($total);
var_dump($total_pu);
var_dump($total_p);
var_dump($pagado);
var_dump($pdt);
0
ответ дан 23.12.2019, 22:06

Теги

Похожие вопросы