2012-07-10 3 views
2

PHP의 sprintf이 일부 숫자를 변경하는 것 같은 이상한 문제가 있습니다. 항상 가끔씩 그런 일이 발생하지는 않습니다.잘못된 번호를 표시하는 PHP sprintf

다음 코드 :

echo sprintf('%04d',$product['priceUSD']*100)."(".($product['priceUSD']*100).")"; 

은 $ 19.99 제품에 대한 다음과 같은 출력을 생성합니다 1998(1999)

나는이 문제를 해결할 수 있지만, 나는 그것을하고있는 이유를 알고 사랑하고, 경우 것 명백한 광기에 어떤 방법이있어.

업데이트 : float에서 int로 변환 할 때 발생하는 것처럼 보입니다. 당신이 찾고있는 무엇 숫자 형식

echo (int)($product['priceUSD']*100)."(".($product['priceUSD']*100).")"; 
+7

모든 프로그래머가 알아야 할 부동 소수점 연산에 관하여 : HTTP : // 부동 소수점 --gui.de/ –

답변

0
echo sprintf('%.2f',$product['priceUSD']*100)."(".sprintf('%.2f',$product['priceUSD']*100).")"; 

: 다음은 동일한 출력을 제공?

0

첫 번째 off : %d(int)과 같습니다.

19.99 = 1.99899999999999984368059813278E1 = 0x4033FD70A3D70A3D 

(IEEE 64 비트).

부동 소수점에 100을 곱하면 1998.99999999999984368059813278E1이 int에 캐스트됩니다. 1998입니다.

는 "19.99는 하나 그 숫자는 ..."정확한 결과를 위해 는 bc 수학 확장자를 사용 (Dragons Link @ 참조)

echo sprintf('%4d', bcmul ($price,100));