2017-09-22 250 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