PHP yuvarlama sorunu (5.2.3)?

3 Cevap php

Ben PHP yuvarlama ile bir sorunu olduğunu merak ediyorum, özellikle 5.2.3 (ben şu anda diğer sürümleri hakkında emin değilim):

$t = 0;

$taxAmount = (5.000 / 100) * 0.7;
$t += $taxAmount;

var_dump($t); // float(0.035)
var_dump(round($t, 2)); // float(0.03)
var_dump(number_format($t, 2)); // string(4) "0.03"

Benim için 0.035 0.04 yuvarlamak gerekir ya ben deli miyim?

Edit

Için Thxs NebyGemini's answer, ben yerine bunu düşündüm:

$t = 0;

$taxAmount = bcmul(bcdiv(5.000, 100, 3), 0.7, 3);
$t += $taxAmount;

var_dump($t); // float(0.035)
var_dump(round($t, 2)); // float(0.04)
var_dump(number_format($t, 2)); // string(4) "0.04"

Hangi mükemmel çalışır.

BTW, ben bir alışveriş sepeti bir vergi hesaplama ediyorum. Sipariş toplamı 0.70 (70 cent) ve vergi% 5'tir.

Edit

Thxs için Ignacio Vazquez-Abrams's answer, bu sorun burada yatıyor göstermek için:

printf('%.18F', 5.000 / 100 * 0.7);

3 Cevap

Floats are evil.

Alıntı http://php.net/float

"Son basamağa numara sonuçları kayan güven Yani asla ve eşitlik için kayan nokta sayıları karşılaştırmak asla. Daha yüksek hassasiyet gerekli ise, arbitrary precision math functions ve gmp fonksiyonları mevcuttur."

Python diyor ki:

>>> repr(5./100*0.7)
'0.034999999999999996'

Bu IEEE754 doğruluk sınırlamaları nedeniyle. Eğer tam doğruluk gerekirse sabit bir nokta türünü kullanın.

Sen PHP_ROUND_HALF_UP kullanabilirsiniz, ancak sayı kendine dönüşümü bir konu "99999 ..." var