亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么從 float64 到 int 的轉換會導致值增加 1?

為什么從 float64 到 int 的轉換會導致值增加 1?

Go
泛舟湖上清波郎朗 2022-09-12 17:02:05
將 float64 類型轉換為 int 時,我希望結果為 。但是,實際結果是 ,它比 1 大。630948893921274879630948893921274879630948893921274880這是什么原因呢?import (    "fmt")func main() {    var p float64 = 630948893921274879    fmt.Println(int(p))   // 630948893921274880    fmt.Printf("%f\n", p) // 630948893921274880.000000}https://play.golang.org/p/gbXKCkZ6_rF
查看完整描述

3 回答

?
至尊寶的傳說

TA貢獻1789條經驗 獲得超10個贊

630948893921274879大于最大整數可以在不進行舍入的情況下進行編碼?!案↑c數”(即浮點數)的工作方式與科學記數法相同。它們存儲一定數量的有效數字,然后將其乘以某個二次方。630948893921274879需要比 float64 可以容納的更多有效數字,因此它會四舍五入到它可以表示的最接近的值。float64

如果需要處理這么大的整數,則需要始終使用整數。不能轉換為浮點值。


查看完整回答
反對 回復 2022-09-12
?
catspeake

TA貢獻1111條經驗 獲得超0個贊

float64不會比“免費”“更大”。它犧牲了精度和范圍。int64

在一定幅度之后,整數只能表示為最接近的 2。當你變得更大時,你最終會每4個跳過一次,然后每8個跳過一次,依此類推。


查看完整回答
反對 回復 2022-09-12
?
拉風的咖菲貓

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 本身。


查看完整回答
反對 回復 2022-09-12
  • 3 回答
  • 0 關注
  • 140 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號