に関するいくつかの一般的な問題 1. PHP 浮動小数点数
に関する一般的な問題 まず、例を見てみましょう。 ? なぜ出力は 57 なのでしょうか?これはphpのバグでしょうか?この質問を理解するには、浮動小数点数の表現を理解する必要があります。<?php $f = 0.58; var_dump(intval($f * 100)); //为啥输出57?>
? 浮動小数点数は 64 ビット長 (倍精度) であり、1 つの符号ビット (E)、11 の指数ビット (Q)、および 52 ビットの仮数 (M) が使用されます。を表します(合計 64 ビット)。
? ?①符号ビット: 最上位ビットはデータの符号を表し、0 は正の数を表し、1 は負の数を表します。
? ?②指数ビット: 指数を基数 2 で表し、
? ③仮数部: 小数点以下の有効桁を示します。データの。
? ?ここで重要なのは、2 進数での小数をどのように表現するかです。以下に示すように、部分を 2 進数で表現します。 >
? 整数を 2 で割って、0 の位置に到達するまでの余りを確認するだけです。整数部分の計算は非常に簡単なので、小数部分の計算方法を見てみましょう。
? ? 2. 小数部分は 2 進数で表され、計算方法は次のとおりです。 >
?例: 5.6。整数部 5 の 2 進表現は 101? 小数部 0.6 は次のような式になります。 *2
? そうすると、0.6*2=0.2? 1 ? Base=0.4 ? 0.8*2=1.6?すると、底は1.6-1=0.6?...? ? ?したがって、5.6 は次のように表現できます: 101.1001...
? ?
3 と 0.58 は次のように無限に長い値です: ? ?具体的な浮動小数点数の乗算 0.58 * 100 については、詳しく考えず、0.58 * 100=57.999999999 とだけ考えます。そうすると intval は当然 57 になります。 ? この問題の重要な点は、「10 進数は有限であるように見えますが、コンピューターの 2 進数表現では無限です
」であることがわかります。 。2. PHP 配列の結合
? 配列の結合というと、array_merge 関数または array_merge_recursive 関数を思い浮かべます。このように皆さんはめったに思いつきませんが、「 」演算子です。それぞれの使用法を見てみましょう:? 1. array_merge の添字が整数型の場合:
0.58的二进制表示基本上(52位)是: 00101000111101011100001010001111010111000010100011110.57的二进制表示基本上(52位)是: 0010001111010111000010100011110101110000101000111101
?は破棄され、元の配列の順序に従って新しいマージされた配列が生成されます。
?2. 配列の添字が文字列型の場合の array_merge :
? 配列の添字が保持されていることがわかります。元の配列内 ラベルが一致している場合、後続の配列の値は前の配列の値を上書きします。?3. array_merge_recursive が整数型の場合:
? 結果は array_merge と同じであることがわかります。
$arr1 = array(1=>1,2=>2,3=>3);$arr2 = array(1=>2,2=>3,3=>4);$arr3 = array_merge($arr1,$arr2);print_r($arr3);//输出为Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 2 [4] => 3 [5] => 4 )
array_merge_recursive 配列の添字が文字列型の場合:
$arr1 = array('aa'=>1,'bb'=>2,'cc'=>3);$arr2 = array('bb'=>'b','cc'=>'c','dd'=>4);$arr3 = array_merge($arr1,$arr2);print_r($arr3);//输出为Array ( [aa] => 1 [bb] => b [cc] => c [dd] => 4 )
? >添字は保持されており、元の配列の添字が一貫していれば数値の上書きは発生しないことがわかりました。代わりに、これらの値を格納するために配列が生成されます。 ?
? 5. " " 演算子を使用する場合:$arr1 = array(1=>1,2=>2,3=>3);$arr2 = array(1=>2,2=>3,3=>4);$arr3 = array_merge_recursive($arr1,$arr2);print_r($arr3);//输出为Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 2 [4] => 3 [5] => 4 )
?数値は依然として文字列です。元の配列に同じ添え字がある場合、後続の配列のデータは保存されません。実は、「 」の機能は、前の配列の添え字がまだ出現していないデータを、後の配列からこの中に補完する機能です。