我正在尝试解决以下问题,但是对此没有很好的解决方案。
我有以下float64 0.123456789 并希望按照以下步长进行计数:0.0001
所以结果应该是0.123400000
我当前的解决方案确实很丑陋,效果不佳:
var waletMoney float64
var stepSize float64
var tmpMoney float64
waletMoney = 0.123456789
stepSize = 0.0001
tmpMoney = 0.0000000
loop := true
for loop {
tmpMoney = tmpMoney + stepSize
// fmt.Println(tmpMoney)
if tmpMoney+stepSize >= waletMoney {
loop = false
}
}
fmt.Println(tmpMoney)
// result is 0.12340000000000251 but should be 0.123400000 or 0.1234
答案 0 :(得分:1)
package main
import (
"fmt"
)
func main() {
var waletMoney float64
var stepSize float64
var tmpMoney float64
waletMoney = 0.123456789
stepSize = 0.00001
tmpMoney = float64(int(waletMoney /stepSize)) *stepSize
fmt.Println(tmpMoney)
}
答案 1 :(得分:0)
问题是float64
使用IEEE 754表示形式,而不能完全表示0.0001
。反复添加它与使用十进制(纸和铅笔)算法的效果不同。
至少可以避免多次舍入错误的一件事是使用计数器并乘而不是重复加法,这会累积舍入错误。
tmpMoney = 0.0
loop := true
count := 0
for loop {
tmpMoney = stepSize * float64(count)
// fmt.Println(tmpMoney)
if tmpMoney + stepSize >= waletMoney {
loop = false
}
count += 1
}