2017-09-22 252 views
0

我想要一種方法來精確地減去Go中的2個浮點數。在Go算法中處理浮點數精度?

我試過使用math/big庫,但我無法得到準確的結果。

我用Javascript中的big.js庫來解決這個問題。 Go算法有類似的庫/方法嗎?

package main 

    import (
     "fmt" 
     "math/big" 
    ) 

    func main() { 
     const prec = 200 
     a := new(big.Float).SetPrec(prec).SetFloat64(5000.0) 
     b := new(big.Float).SetPrec(prec).SetFloat64(4000.30) 
     result := new(big.Float).Sub(a, b) 
     fmt.Println(result) 
    } 
    Result: 999.6999999999998181010596454143524169921875 

https://play.golang.org/p/vomAr87Xln

+2

您的輸出與輸入信息一樣準確。你的輸入是float64s。如果你想要更精確的話,不要以float64s開頭。 – user2357112

+2

@ user2357112:精度也是內部表示的函數,它是二進制浮點數(對於十進制,近似值)。 – peterSO

回答

2

Package big

導入 「數學/大」

func (*Float) String

func (x *Float) String() string 

字符串格式X像x.Text( 'G',10 )。 (字符串必須顯式調用 ,Float.Format不支持%s的動詞。)

使用字符串輸入和圓形的輸出,例如,

package main 

import (
    "fmt" 
    "math/big" 
) 

func main() { 
    const prec = 200 
    a, _ := new(big.Float).SetPrec(prec).SetString("5000") 
    b, _ := new(big.Float).SetPrec(prec).SetString("4000.30") 
    result := new(big.Float).Sub(a, b) 
    fmt.Println(result) 
    fmt.Println(result.String()) 
} 

輸出:

999.6999999999999999999999999999999999999999999999999999999995 
999.7 

對於十進制,根據定義,二進制浮點數是一個近似值。例如,十進制數0.1不能完全表示,它大約爲1.10011001100110011001101 * (2**(-4))

你已經習慣了這種事情,因爲你知道重複小數,有理數的近似值:1/3 = .333...3227/555 = 5.8144144144...

參見What Every Computer Scientist Should Know About Floating-Point Arithmetic

1

也許試試github.com/shopspring/decimal

它自稱爲「任意精度定點十進制數進去」的包。

注意:「只能」表示小數點後最多有2^31個數字的數字。

+0

太好了,謝謝你的鏈接! – patrickandroid