我对在 Go 中准确减去 2 个 float 的方法很感兴趣。
我尝试使用 math/big
库,但无法获得准确的结果。
我用过 big.js Javascript 中的库解决了这个问题。 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
最佳答案
import "math/big"
func (x *Float) String() string
String formats x like x.Text('g', 10). (String must be called explicitly, Float.Format does not support %s verb.)
使用字符串输入并对输出进行四舍五入,例如
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
对于十进制,根据定义,二进制 float 是一个近似值。例如,十进制数0.1
无法精确表示,它近似为1.10011001100110011001101 * (2**(-4))
。
你已经习惯了这种事情,因为你知道重复小数,有理数的近似值:1/3 = .333...
和 3227/555 = 5.8144144144 ...
。
参见 What Every Computer Scientist Should Know About Floating-Point Arithmetic .
关于math - 处理 Go 算术中的 float 精度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46374304/