逐步计算

时间:2019-12-30 06:48:29

标签: go

我正在尝试解决以下问题,但是对此没有很好的解决方案。

我有以下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

https://play.golang.org/p/vM-3qZ05QOR

2 个答案:

答案 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
}