JavaScript を使用して、浮動小数点数が別の浮動小数点数の倍数であるかどうかを判断する必要があります。
浮動小数点数に関する他の質問をいくつか読みましたが、モジュロ演算子 (%) では正しく機能しないことがわかりました。また、10/100/1000 などを掛けることで浮動小数点数を整数に変換できることも読みましたが、これはすべての場合に正しく機能するとは限りません。
例:
var A = 25.13;
var B = .0001;
var Value = A*1e5;
var Step = B*1e5;
// Is Value a multiple of Step?
if(0 === (Value % Step)) {
// Do something
}
この場合、Value は Step の倍数であり、正しく機能します。しかし、どうですか:
var A = 2.2;
var B = .0001;
有効な倍数である必要がありますが、代わりに次のようになります。
220000.00000000003 % 10 = 2.9103830456733704e-11
小数点第 11 位に誤った 3 があります。次のようにして、丸めの問題を修正できると思いtoFixed()
ました。
var Value = (A*1e5).toFixed(10);
var Step = (B*1e5).toFixed(10);
しかし、そうする場合:
var A = 45436212356482;
var B = .0001;
あなたは得る:
4543621235648200192.0000000000 % 10.0000000000=2
有効な倍数ですが、そうではないと考えています。
と:
var A = 45436212546522156.45621565421;
var B = .0001;
これは有効な倍数ではありませんが、次のように考えられます。
4.543621254652216e+21 % 10.0000000000=0
ある浮動小数点が別の浮動小数点の倍数かどうかを判断する巧妙なトリックはありますか? それともこれは不可能ですか?
アップデート:
目標は、ユーザーが入力する数値 (整数または小数) を特定の増分に制限することです。
- Increment が 1 の場合、ユーザーは 1、2、3、4 などを入力できます。
- Increment が .5 の場合、ユーザーは .5、1、1.5、2、2.5 などと入力できます。
- Increment が .0002 の場合、ユーザーは 1,1.001,1.0004,1.0006 を入力できますが、1.0001 は入力できません。
論理的な観点からは、特定の値が特定のインクリメントの有効な倍数である場合とそうでない場合があります。