3 回答

TA貢獻1789條經驗 獲得超10個贊
630948893921274879大于最大整數可以在不進行舍入的情況下進行編碼?!案↑c數”(即浮點數)的工作方式與科學記數法相同。它們存儲一定數量的有效數字,然后將其乘以某個二次方。630948893921274879需要比 float64 可以容納的更多有效數字,因此它會四舍五入到它可以表示的最接近的值。float64
如果需要處理這么大的整數,則需要始終使用整數。不能轉換為浮點值。

TA貢獻1111條經驗 獲得超0個贊
float64
不會比“免費”“更大”。它犧牲了精度和范圍。int64
在一定幅度之后,整數只能表示為最接近的 2。當你變得更大時,你最終會每4個跳過一次,然后每8個跳過一次,依此類推。

TA貢獻1995條經驗 獲得超2個贊
您的浮點數不能存儲為630948893921274879,而是最接近的模擬630948893921274880。以基數 2 為準,lg(630948893921274879) 介于 59 和 60 之間。因此,數字之間的間距為 2^(59-52) = 2^7 = 128。這意味著 2^59 和 2^60 之間的任何數字都將四舍五入到最接近的 128 的倍數。
解釋:浮點數(任何大小,不僅僅是64)不是一個數字,而是3個數字相乘。對于 64 位浮點數:第一個數字是符號,長度為 1 位。第二個數字是指數,長度為 11 位。最后一個數字是有效數(AKA 尾數、分數和其他一些名稱),長度為 52 位。最后一個數字是 -1^符號 * 2^指數 * 1.有效數。1.有效數將等于 1 和(幾乎)2 之間的數字。這意味著,每次達到2的倍數時,指數將增加,有效數將重置。由于指數增加,您獲得的數字的準確性將降低一半,因為有效數的最微小的增加現在將是兩倍大。您的數字恰好位于有效數的最小變化導致增加128的點;因此,您的數字將四舍五入到最接近的 128 的倍數。因此,導致問題的不是 float64 到 int 的轉換,而是 float64 本身。
- 3 回答
- 0 關注
- 140 瀏覽
添加回答
舉報