2012-10-25 2 views
0
<?php 
    $last_percent = 0; 
    $as = array("110.800002098083", "30", "36.1499996185303", "11", "13", "13.9899997711182", "74.5200042724609", "13.9899997711182"); 
    $t = 304.46000552177; 
    foreach($as as $a) { 
     $last_percent += round($a*100/$t, 2); 
    } 
    var_dump($last_percent); 
    $last_percent = 100 - $last_percent; 
    var_dump($last_percent); 
?> 

왜 결과는 0.33000000000001입니까? 왜 100과 99에서만 일어날까요? 내가 $ last_percent = 90 - $ last_percent를 사용한다면; 결과는 -9.67입니다.PHP 라운드 미친 버그

+2

부동입니다. 포인트. 수학. – rdlowrey

+2

[모든 컴퓨터 과학자가 부동 소수점 연산에 대해 알아야 할 사항] (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) – sachleen

+1

http://php.net/manual/ en/language.types.float.php <- 경고가있는 큰 빨간색 상자가 있습니다. 읽어. – hakre

답변

1

100 % 정밀도가 필요할 때 부동 소수점 계산은 신뢰할 수 없습니다. PHP 문서에는 여기에 대한 공식 경고가 http://php.net/manual/en/language.types.float.php이며 높은 정밀도의 계산이 필요한 경우 임의 정밀도 수학 함수 또는 gmp 함수를 사용해야합니다.

+5

* "PHP는 부동 소수점 숫자로 작업 할 때 비현실적입니다."* ... PHP **는 신뢰할 수 없습니다. * 부동 소수점 연산 *은 정확하지 않습니다. – rdlowrey

+1

죄송합니다. 사실, PHP가 아닙니다. 부동 소수점 문제입니다. –

+1

@ElenaSharovar - 그럼 [편집 대답] (http://stackoverflow.com/posts/13061289/edit)에 대한 의견은 무엇입니까? – ghoti

4

짧은 대답은 float 값이 완벽하지 않다는 것입니다. 때로는 시스템 설정에 따라 오류가 있습니다.

float 값은 숫자 값의 정확한 표현이 아니라는 점에서, 대부분의 경우에는 근사값입니다. 문제는 때로는 원하는 값이 float이 완벽하게 작동하지 않는 지역에 빠지며 이러한 반올림 오류가 발생한다는 것입니다.

이 때문에 재무 응용 프로그램과 같이 정확한 값을 사용하는 시스템에서는 수레가 사용되지 않습니다. 이들은 특수 목적의 고정밀 유형을 사용하거나 두 개의 정수 값을 갖는 달러와 센트를 나타냅니다.

0

왜 부동 소수점 숫자는 정확한되지 않습니다

그들은 이진 분수의 화합물로 소수를 취급합니다. 1/2 + 1/4 + 1/8 + 1/16 + ...

모든 숫자가 완벽하게 표현 될 수있는 것은 아니므로 단순히 '최선의 시도'를 제공합니다.