6

文字列を base36 に変換するときに、Python と JavaScript の間にいくつかの矛盾があることに気付きました。

Python メソッド:

>>> print int('abcdefghijr', 36)

結果: 37713647386641447

Javascript メソッド:

<script>
    document.write(parseInt("abcdefghijr", 36));
</script>

結果: 37713647386641450

2 つの言語間で結果が異なる原因は何ですか? 言語に関係なく同じ結果を生成するための最良のアプローチは何でしょうか?

ありがとうございました。

4

1 に答える 1

10

その数値を表すには 56 ビットが必要です。JavaScript の数値は、実際には倍精度の 2 進浮動小数点数、またはdouble略してです。これらは合計で 64 ビットであり、64 ビット整数よりもはるかに広い範囲の値を表すことができますが、それを達成する方法 (数値を として表す) が原因で、その範囲内のすべてのmantissa * 2^exponent数値を表すことはできません。倍数が仮数に収まる倍数です(2 ^ 0 = 1が含まれているため、仮数が直接処理できるすべての整数を取得できます)。仮数部は 53 ビットで、この数には不十分です。したがって、表現できる数値に丸められます。2^exponent

できることは、gwt-mathまたはのようなサードパーティ ライブラリによって定義された任意精度の数値型を使用することですBig.js。学校の算数を知っていれば、これらの数値を実装するのは難しくありません。それを効率的に行うことは別の問題ですが、広範な研究分野でもあります。既存のライブラリを使用する場合は問題ありません。

于 2012-10-17T13:55:45.600 に答える