ホームページ >バックエンド開発 >PHPの問題 >PHP 浮動小数点計算エラーの理由

PHP 浮動小数点計算エラーの理由

(*-*)浩
(*-*)浩オリジナル
2019-10-16 10:01:322652ブラウズ

PHP 浮動小数点計算エラーの理由

例: (推奨学習: PHP ビデオ チュートリアル)

echo intval(0.58*100);//结果为57
echo intval((0.1 + 0.7) * 10);//结果为7

その理由は次のとおりです。コンピュータ 一部の浮動小数点数は、10 進数で 10/3 を正確に表現できないのと同様に、2 進数で内部的に正確に表現できません。

コンピュータにおける浮動小数点数の内部表現: IEEE 754理解できない場合は、自分で調べてください。 Information

Bird Brother によるこの記事も参照できます: http://www.laruence.com/2013/03/26/2884.html

<?php
echo intval(0.58*100);//57,注意啦
echo &#39;<br/>&#39;;
echo intval(bcmul(0.58, 100));//58
echo &#39;<br/>&#39;;
echo floor(strval(0.58*100));//58
echo &#39;<br/>&#39;;
echo (int)(0.58 * 1000/10);//58
echo &#39;<br/>&#39;;
echo intval((0.1 + 0.7) * 10);//7,注意啦
echo &#39;<br/>&#39;;
echo intval(bcadd("0.1", "0.7",1) * 10);  //8
?>

別の例を見てみましょう

<?php
if((0.1 + 0.7) == 0.8){
	echo &#39;相等&#39;; 
}else{
	echo &#39;不相等&#39;; //这里输出
}
echo &#39;<br />&#39;;
$a = 0.1 + 0.7;
echo $a; //0.8
echo &#39;<br/>&#39;;
if($a == 0.8){ 
	echo &#39;一天一小步&#39;;
}else{
	echo &#39;一年一大步&#39;; //这里输出
}
echo &#39;<br/>&#39;;
if(strval($a) == 0.8){
	echo &#39;一天一小步&#39;; //这里输出
}else{
	echo &#39;一年一大步&#39;; 
}
echo &#39;<br/>&#39;;
if(bcadd(0.1, 0.7,1) == 0.8){
	echo &#39;一天一小步&#39;; //这里输出
}else{
	echo &#39;一年一大步&#39;;
}
/*
结果:
不相等
0.8
一年一大步
一天一小步
一天一小步
*/
?>

$a = 0.00...00(n zeros)1 0.7; strval を使用して $a の値を取得する場合、$a がと 0.8 が等しいのは、n 個のゼロの数が異なるためです。異なる

bcadd 関数は、保持する小数点以下の桁数に応じて 2 つの数値を加算し、後続の小数点以下を破棄します

除算の例を見てください:

<?php
echo 160500643816367088/10;//1.6050064381637E+16
echo &#39;<br/>&#39;;
echo intval(160500643816367088/10);//16050064381636710
echo &#39;<br/>&#39;;
echo bcdiv(160500643816367088,10);//16050064381636708
?>

したがって、浮動小数点数などの機密データを計算するには、PHP の BC 関数を使用することをお勧めします

以上がPHP 浮動小数点計算エラーの理由の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。