★免責事項:一部の機能はアルゴリズムを開示していないため、以下の内容は私のテストと推測に過ぎず、事実との整合性を保証するものではありません。
=======================================
最初にコードを見てください。
var num1 = math.round( 0.575*100 )
console.log( num1 );
結果:
問題分析:
1、0.575 * 100 = 57.5
2.ラウンド57.5(10進数はデフォルトで破棄され、1桁に予約されます)、結果は58になるはずですが、実際の結果は57です。明らかにこれは間違っています。
では、どこに問題があるのでしょうか。1つずつ分析してみましょう。最初に2つの写真を見てください。
同じことが57.5に丸められますが、結果が異なるのはなぜですか?
実際、これら2つの57.5の本質は異なるはずだと思います。
それを徹底的にテストしてみましょう:
これらの2つの値はまだ同じであり、トリッキーなものは見つかりません。
さらに深く掘り下げて、次の2つの値を拡大します。
ハハ、私はそれを見つけました、それは非常に明白です、2つの値は異なります。
知識のポイント:精度に影響を与える値を処理するコンピューターのメカニズムのため、57.5 * 100の計算結果は実際には57.5ではなく、57.49999999999999 .. ..
しかし、なぜaardioは57.5を表示するのですか?
続けて探し、本質を探し、なぜaardioが[2つの同じ値]の幻想を見せてくれるのか見てみましょう。
テスト後、aardioが値を表示すると、小数点以下15桁から自動的に四捨五入されることがわかりました。
したがって、小数点以下の桁数が15桁未満であれば問題ありませんが、15桁に達すると、実際の値とは表示値が異なります。
15位を丸めるaardioの問題を引き続き特定するために、さらにテストを行いました。
ひねりを加えた後、問題が再び発見されました。最後の桁は5で、前進していませんでした。それはされてい四捨五入アップ。
math.round()が同じかどうかをテストしてみましょう。
ええと、何が問題なのですか?
この……!!??
math.round()に問題があり、10番目の位置から、混乱していました。
math.round()は小数点以下9桁のみをサポートしますか?!
数値増幅試験
そんな可能性があるようです。10桁は正確ではないため、9桁が正確かどうかを確認します。
OK、引き続きズームインして以下を確認してください。
基本的には問題ありません。
math.round()自体に精度の問題があるようです。したがって、私はmath.round()を使用して、小数点以下14桁のアイデアを処理したいと考えていますが、これは簡単には実現できません。
結論として
数学の計算にはさまざまな未知の問題がありますが、最終的に、処理する値が表示された値と同じであることを確認するにはどうすればよいでしょうか。
元々、上記のルールに従って値を丸めるだけで済みました。
しかし、math.round()には問題があり、console.logなどの関数は単なる丸め以上のものであるため、妥協して2つの不完全な解決策を考え出すことしかできません。
1. console.logはtostring()を使用して値を文字列に変換し、tostringの動作方法がわからないため、最初にtostring関数を使用してから、tonumber関数を使用して[値→文字列→値]変換プロセスの。これにより、表示される値が実際の値と同じになります。
2. math.round(、9)を直接使用して処理します。処理後の小数点以下の桁数は9桁を超えませんが、表示値との整合性を確保するだけでなく、処理効率と精度を可能な限り確保します。
★提案:
小数を含む計算の場合は、計算結果を丸めて、不正確な可能性のある結果を許容可能な精度で固定値に変換してみてください。
次のような不正確な結果:
0.1 + 0.1 = 0.20000000000000001;
0.575×100 = 57.499999999999993;
0.14×100 = 14.0000000000000002;
一般に、この種の不正確な結果は、小数部分が非常に長くなります。小数点から9桁以内に丸めることをお勧めします。
といった:
恐らくMath.round(0.1 + 0.1 、9)= 0.2。
恐らくMath.round(0.575×100 、9)= 57.5。
恐らくMath.round(0.14×100 、9)= 14。
最終的な効果は次のとおりです。