2016-09-22 18 views
5

Trong khi chuyển đổi một số float32 sang độ chính xác float64 đang bị mất trong Go. Ví dụ chuyển đổi 359.9 thành float64 tạo ra 359.8999938964844. Nếu float32 có thể được lưu trữ chính xác tại sao float64 mất độ chính xác?Tại sao tôi mất độ chính xác trong khi chuyển đổi float32 sang float64?

Mẫu mã:

package main 

import (
    "fmt" 
) 

func main() { 
    var a float32 = 359.9 
    fmt.Println(a) 
    fmt.Println(float64(a)) 
} 

Thử nó trên Playground

+2

https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html – Mysticial

Trả lời

6

Bạn bao giờ chính xác mất khi chuyển đổi từ một float (ví dụ: float32) vào một double (float64). trước đây phải là là tập con của phần sau.

Đó là nhiều hơn để làm với độ chính xác mặc định của định dạng đầu ra.

Các IEEE754 gần float tới 359,9 là

359.899993896484375 

Các IEEE754 gần double-359,9 là

359.8999999999999772626324556767940521240234375 

Các IEEE754 gần double-359,899993896484375 là

359.899993896484375 

(tức là tương tự, do sự suy yếu ru le Tôi đã đề cập).

Vì vậy, bạn có thể thấy rằng float64(a) giống với float64(359.899993896484375)359.899993896484375. Điều này giải thích rằng đầu ra, mặc dù trình định dạng của bạn làm tròn hai chữ số cuối cùng.

+0

tôi đang nói về golang đặc biệt ở đây. golang có thể lưu trữ chính xác 359,9 nhưng sau khi chuyển đổi sang giá trị float64 thay đổi thành 359.8999938964844. –

+0

Tôi đặt một câu mới ở cuối giải thích điều đó. –

+1

@MayankPatel: nhìn vào đầu ra từ các động từ định dạng dấu chấm động khác nhau: https://play.golang.org/p/9CDBLy7DMQ – JimB

3

này đã giúp tôi hiểu @ FaceyMcFaceFace của câu trả lời:

var a float32 = math.Pi 
fmt.Println(a) 
fmt.Println(float64(a)) 
fmt.Println(float64(math.Pi)) 

3.1415927 
3.1415927410125732 
3.141592653589793 

https://play.golang.org/p/-bAQLqjlLG

Các vấn đề liên quan