2016-08-19 3 views
1

저는 재무 신청서를 작성 중입니다. 나는 double (30,20)처럼 20 진수로 저장한다. 나는 계산 중에 이상한 문제를 겪고있다. 나는 Laravel5.2를 사용하고 있습니다. PHP, Laravel에
3 다른 결과, 엑셀number_format 계산에 이상한 문제가 발생했습니다.

Input1 = 280.95000000000000  
Input2 = 278.76250000000000 

// Results Number_format to 14 
$result = Input1 - Input2; 
PHP = 2.18750000000000 
Laravel = 2.18750000000006 
Excel = 2.18749999999994 

이 세 가지 다른 결과 효과 마지막 %의 결과. 아무도 이것이 왜 다른지 알 수 있습니까?

답변

0

Excel의 정밀도는 최대 15 자 (8 비트) https://en.wikipedia.org/wiki/Numeric_precision_in_Microsoft_Excel입니다. Laraval은 15 비트를가집니다. PHP는 약 14 비트입니다. http://php.net/manual/en/language.types.float.php

많은 숫자를 십진수로 정확하게 표현할 수 없으므로 오류가 발생합니다. 한 가지 간단한 해결 방법은 정수만 있도록 소수점을 이동하는 것입니다. MySQL의 두 배에 대해 무엇

Input1 = 280.9500000000*10000 -> 2809500 
Input2 = 278.7625000000*10000 -> 2787625 
result = (Input1-Input2)/10000 -> 21.875 
+0

가 두 번 저장할 수있다 (30,20) –

+0

당신은 (이진) 0.1 100 소수점 이하 자릿수를 가질 수 있고 여전히 부정확 할 것입니다. http://www.exploringbinary.com/why-0-point-1-does-not-exist-in-floating-point/ 순수한 수학에서 모든 십진수는 동등한 이진수를가집니다. 부동 소수점 수학에서 이것은 사실이 아닙니다. –

관련 문제