我对在Go中准确地减去2个浮点数的方法感兴趣。
我尝试使用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
答案 0 :(得分:4)
导入“math / big”
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 :(得分:1)