8
    ​document.writeln(Math.floor(43.9));

ブラウザで43を生成します。

​document.writeln(Math.floor(43.9999));​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​

43を生成します

 ​document.writeln(Math.floor(43.999999999999));​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​ 

再び43

でも、

    document.writeln(Math.floor(43.99999999999999));

44を生成します。

小数点以下9のマジックナンバーは15*のようです。

どうしてこれなの?

さらに、Math.floor関数は、数値を数値オブジェクトまたは数値値として受け入れますか?

4

5 に答える 5

7

IEEE 754倍精度バイナリ浮動小数点形式(JavaScriptが数値タイプに使用するもの)は、15〜17桁の10進数の精度を提供します。

これにより、15〜17桁の10進数の精度が得られます。最大15桁の10進数の文字列がIEEE754倍精度に変換されてから、同じ数の10進数に戻される場合、最終的な文字列は元の文字列と一致する必要があります。また、IEEE 754倍精度が少なくとも17の有効な10進数を含む10進数文字列に変換されてから、doubleに戻される場合、最終的な数値は元の数値と一致する必要があります[1]。

ソース: http: //en.wikipedia.org/wiki/Double-precision_floating-point_format#IEEE_754_double-precision_binary_floating-point_format :_binary64

于 2012-08-14T18:26:49.943 に答える
5

倍精度浮動小数点数(別名double)は、非常に広範囲の値を格納できますが、有効数字が15〜17桁という限られた精度でしか格納できません。次の手順を実行すると、何が起こるかがわかります。

var x = 43.99999999999999;
var y = 43.999999999999999;

document.writeln(x); // 43.99999999999999
document.writeln(y); // 44
document.writeln(Math.floor(x)); // 43
document.writeln(Math.floor(y)); // 44

他の言語でも同じことがわかります。たとえば、PHP:

echo floor(43.99999999999999); // 43
echo floor(43.999999999999999); // 44
于 2012-08-14T18:27:11.780 に答える
2

Chromeでは43.99999999999999999999999、コンソールに入力するだけで出力44されます。おそらく、これが発生していることです。フローティングポイントは概算です

于 2012-08-14T18:21:43.177 に答える
1

Numberのインスタンスとnumberリテラルの両方を渡すことができます。

Math.floor(43.99999999999999);

Math.floor(new Number(43.99999999999999));
于 2012-08-16T13:19:12.007 に答える
1

この回避策を参照してください。

http://jsfiddle.net/k7huV/3/

var x = 43;
for( var i = 0; i < 16; i++ ){
    if( i == 0 ) x += ".";
    x += "9";   
}
document.writeln(x);
document.writeln(parseInt(x));

出力:43.9999999999999999 43

正しくフロア43.999999999999999から43。

于 2012-08-14T18:25:02.520 に答える