JS float 丸めバグ


Stripe API に慣れてきました.これまでのところは順調ですが、今日、この興味深いバグに遭遇しました. Stripe は、セントを使用して通貨金額を表示します (米国にいる場合).明らかに、エンド ユーザーに表示するときは、適切な読み取り可能な USD に変換する必要があります.

また、更新または購入する場合は、API が要求を受け入れるようにセントに再変換する必要があります.

3380 * 0.01 // converts to $33.8  nothing special here.


私のセットアップで支払いまたは請求を完了するとき. 33.8 ドルをセントに換算します.しかし、そうすると、結果の金額は正確に 3338 になりませんでした.

33.8 * 100 = 3379.9999999999995


このため、Stripe はエラーを返しました.

私の最初の解決策は parseInt を使用することでしたが、3379 が返されました.1 セントが失われたため、これは不十分です.

より満足のいく解決策は、次のことを行うことでした.

33.8.toString().split('.').reduce((a, b) => a * 100 + b * 10) // 3380


別の解決策は、以下のように toFixed を使用して float を丸めることです.

parseInt(33.8 * 100).toFixed()) // 3380