2014-02-06 6 views
2

두 값을 뺄 때 awk 결과가 발생합니다. 오류는 지수 값이 0 대신 2.7755575615629E-17이됩니다. 적용 할 수없는 것이 있으면 제안하십시오. 이것들은 단지 0.66 같은 경우에 0.67, 0.33,PHP : 지수 값을 제공하는 awk 빼기

나는 아래에 주어진 사용하고있는 코드의 프로토 타입,

    $_SESSION['x'] = 1; 
      $_SESSION['x'] = $_SESSION['x'] - 0.83; 
      echo ($_SESSION['x']- 0.17) ; 
      echo '<br>'; 

일어나고 그러나 0

와 모든 좋은 값을 반전에있다
    $_SESSION['x'] = 1; 
      $_SESSION['x'] = $_SESSION['x'] - 0.17; 
      echo ($_SESSION['x']- 0.83) ; 
      echo '<br>'; 
+0

은 무엇이 AWK와 무슨 상관 우리가 경우 ??? –

답변

2

컴퓨터 언어의 일반적인 문제입니다. 부동 소수점 값은 정확하게 표현되지 않습니다. http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems도 참조하십시오. 당신은 소수점 이하 자릿수의 특정 금액이있는 경우는 PHP에 bcmath 기능을 사용할 수 있습니다 정확히으로 계산할 :

$_SESSION['x'] = 1; 
$_SESSION['x'] = bcsub($_SESSION['x'], 0.83, 10); 
echo bcsub($_SESSION['x'], 0.17, 10); 
echo '<br>'; 

그렇지 않으면 당신은 단순히 당신의 계산을 사용하고 계산 된 결과에 round($result, $numberOfDecimalPlaces)를 추가 할 수 있습니다.

+0

고마워요. 작동하지 않습니다. 저는 원형 func를 사용하고 있었지만 fgt를 사용하여 하위에 적용했습니다. 분할 부분에서만 (원래 코드 스 니펫에서) 수행 중이었습니다. – atjoshi

3

이것은 부동 소수점 숫자 때문입니다. 그리고 수동

따라 "대략 14 진수의 정밀도 1.8e308 ~ 최대 공통 값 (64 비트 IEEE 포맷)이지만 플로트의 크기, 플랫폼 - 의존적이다."

http://php.net/manual/en/language.types.float.php

이제 유형을 사용하여 결과를 (int)로 캐스트하거나 결과를 반올림하여 수행 할 수있는 두 가지 작업이 있습니다.

다른 옵션이 여기에 sprintf

사용하는 것은 출력은 우리가 할 경우 지금

1.234E-5 

로 될 것입니다 예를 들어

$a = 0.000; 
echo $a ; 

입니다

echo (int)$a ; 
The output is 0 

또는

echo round($a) ; 

output will be 0 

그리고 마지막으로

echo sprintf('%f', $a); 

We will get 0.000012