簡體   English   中英

如何在JavaScript中獲取包含大量數字的精確值字符串?

[英]How can I get exact value string of huge numbers in JavaScript?

我知道JavaScript數字只是“雙精度”數字,分數部分的精度只有52位。 但是,對於大數,REAL JavaScript數字似乎具有更高的實用精度。

例如,預定義的常數Number.MAX_VALUE表示Number類型的最大正有限值,大約為1.7976931348623157e + 308。 在這里,我可以使用模運算符訪問該值的尾數。

> Number.MAX_VALUE
1.7976931348623157e+308
> Number.MAX_VALUE % 10000000000
4124858368

從這個結果中,我可以假設這個數字是7fef ffff ffff ffff ,它表示(1 +(1 − 2 ** -52))×2 ** 1023( Wikipedia ),並且可以按照以下精確形式進行轉錄:

179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368

...而我們只看到這309位數字的后10位數字。 因此,我認為每個JavaScript數字都必須使用小數形式的確切數字。

我的問題是:如何在JavaScript中獲取此309位數字的字符串? 由於如此Number.MAX_VALUE / 10000000000 % 10000000000類的挑戰就失敗了。

此外,諸如Number.MIN_VALUE小數字又如何呢? 這必須是小數形式的以下分數。

0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004940656458412465441765687928682213723650598026143247644255856825006755072702087518652998363616359923797965646954457177309266567103559397963987747960107818781263007131903114045278458171678489821036887186360569987307230500063874091535649843873124733972731696151400317153853980741262385655911710266585566867681870395603106249319452715914924553293054565444011274801297099995419319894090804165633245247571478690147267801593552386115501348035264934720193790268107107491703332226844753335720832431936092382893458368060106011506169809753078342277318329247904982524730776375927247874656084778203734469699533647017972677717585125660551199131504891101451037862738167250955837389733598993664809941164205702637090279242767544565229087538682506419718265533447265625

MAX_VALUE的所有數字是: 179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

查看以下代碼:

http://howjs.com/?%3Aload%20http%3A%2F%2Fwww.javascriptoo.com%2Fapplication%2Fhtml%2Fjs%2FMikeMcl%2Fbig.js%2Fbig.min.js%0A%0Avar%20max%20% 3D%20new%20Big(%20Number.MAX_VALUE%20)%3B%0Amax.toFixed()%3B

IEEE浮點數的實際實現有點令人困惑。

我發現如果您想到一個更簡單的形式會有所幫助,除了在IEEE格式更好的上溢和下溢附近,這種響應在所有地方都相同。

形式如下:

浮點數包括:

  1. 數字符號(+/-)
  2. 一個無符號的整數值,稱為“尾數”-將其設為“ v”
  3. 一個無符號整數值,稱為“指數”-使此值為“ n”
  4. 指數的“符號”。

數字的符號很簡單-前面是否有減號。
該值計算為:

v*2ⁿ 

如果指數的符號為正,則指數基本上是2 * 2 * 2 * ... * 2(與您指定的一樣多)。 如果用十進制表示一個大數字,它將一直有很多數字一直到小數點,但它們毫無意義。 如果您在約53個二進制數字后以二進制形式顯示數字,則其余所有數字均為零,並且您將無法更改它們。

請注意,對於所有這些都是正數的整數,只要不溢出,浮點數(包括IEEE的整數)將精確地使用整數進行計算。 當您溢出時,它們仍然表現良好,它們的低位只有零。

只有當指數為負時,您才會感到陌生

v/(2ⁿ) 

您獲得的負指數值仍然基於2 * 2 * 2 * ... * 2值,但是您將其除以。 因此,您要嘗試用十分之一,一半,四分之一,八分之一等等來表示一個十分之一…但這並不完全有效,因此會出現舍入錯誤和所有可愛的浮點問題。

您的示例值:

179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368

用二進制表示

1111111111111111111111111111111111111111111111111111100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

末尾有很多零。

每位計算機科學家都應該了解浮點數

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM