php float hesaplama 2 ondalık

6 Cevap php

Tekrar başka bir matematik hesaplama sorunu var.

$a = 34.56

$b = 34.55

$a bu rakam almak için bazı hesaplama

$b bu rakamı almak için en yakın 0,05 yuvarlama yapıyor

ne ne olduğunu

$c = $b - $a

güya ben -0.01 olmalı, ama ben $c show echo -,00988888888888

Ben n umber_format($c, 2) kullanmayı deneyin, ama çıkış 0.00 olduğunu

nasıl emin olabilirsiniz $a ve $b tam 2 ondalık, arkasında hiçbir gizli sayıdır.

Benim php bilgisi görünümünü biçimlendirmek için sadece mümkün number_format, ama değer değil gerçekten 2 onlu,

Ben buradan yardım alabilirsiniz umuyoruz. Bu gerçekten beni hayal kırıklığına.

6 Cevap

Try sprintf ("%.2f", $c);

Eğer firar basamak olsun neden kayan noktalı sayılar böylece ondalık sayılar sonlandırma, 2 güçlere dayanan IEEE gösterimde temsil edilir bir sonlandıran ikili sayı olmayabilir bu.

Değişken Uzunluk Coder tarafından önerilen istediğiniz hassasiyet biliyor ve (para ile uğraşırken örneğin) bu değişmez ise, sadece sabit nokta numaralarını yani kuruş olarak sayıları ifade yerine dolar kullanmak daha iyi olabilir

$a = 3456;

$b = 3455;

$c = $b - $a;

sprintf ("%.2f", $c/100.0);

Yazdırmadan önce hesaplamalar bir sürü yapmak, bu şekilde, herhangi bir yuvarlama hataları olmaz.

Sen çok düzgün sadece BCMath kütüphaneyi kullanarak bütün bu sorunları kaçınmak olabilir.

Sadece dizeleri olarak veya sayısal veri türleri gibi argümanlar geçen olup olmadığını belgeleri okumak ve dikkatli olmayı unutmayın.

Native Calculation:

$a = 34.56;
$b = 34.55;
$c = $b - $a; // -0.010000000000005    

Works as expected (! use always BC functions for real number calculations, the issue is for all C based platforms):

$a = '34.56';
$b = '34.55';
$c = bcsub($b, $a, 4); // -0.0100    

Sen kayan nokta numaraları tuzaklardan birine koşuyoruz; onlar her zaman tam ondalık kesirleri temsil edemez. Eğer tam ondalık değerler isterseniz, tamsayı kullanarak ve sonra sonunda istediğiniz hassas bölünerek daha iyiyiz.

Eğer Dolar (ya da en sevdiğiniz para birimi) represeting yüzen hesaplamalar yapıyoruz Örneğin, aslında tamsayı sent hesaplamalar yapmak isteyebilirsiniz.

Şamandıralar ile hesaplamaları yaparken ben de son zamanlarda bu sorunu içine koştu. Örneğin, ben çıkarılır ve biçimlendirilmiş zaman, değer -0.00 olduğunu 2. yüzer vardı.

$floatOne = 267.58;
$floatTwo = 267.58;
$result = number_format($floatOne - floatTwo, 2);
print $result; //printed a string -0.00

Ne yaptım oldu:

$result = abs($floatOne - $floatTwo);// Made the number positive
print money_format('%i', $result); // printed the desired precision 0.00

In my solution I know that floatOne will never be less than floatTwo. The money_format function is only defined if the system has strfmon capabilities, Windows does not.