我对在Go中精确减去2个float的方法感兴趣。
我尝试使用该 math/big库,但无法获得准确的结果。
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
包装大 导入“数学/大” func(* Float)字符串 func (x *Float) String() string 字符串格式x类似于x.Text(’g’,10)。(必须显式调用字符串,Float.Format不支持%s动词。)
包装大
导入“数学/大”
func(* Float)字符串
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))。
0.1
1.10011001100110011001101 * (2**(-4))
您已经习惯了这种事情,因为您知道重复小数,这是有理数的近似值:1 / 3 = .333...和3227 / 555 = 5.8144144144...。
1 / 3 = .333...
3227 / 555 = 5.8144144144...
参阅每位计算机科学家应了解的有关浮点算法的知识。