猿问

小数点后 1 位和 2 位之间的舍入差

我有一个浮点值,如果超过100,我想舍入到1位小数,如果超过1000,则不舍入小数,否则舍入到2位小数。这有效:


func r(f float64) float64 {

    if f >= 999.5 {

        return math.Round(f)

    }

    if f >= 99.95 {

        return math.Round(f*10) / 10

    }

    return math.Round(f*100) / 100

}

但我想知道这是否会更好:


func r(f float64) float64 {

    if f >= 999.5 {

        return math.Round(f)

    }

    if f*10 >= 999.5 {  // **** only changed line ****

        return math.Round(f*10) / 10

    }

    return math.Round(f*100) / 100

}

这更安全,因为99.95不能完全使用具有二进制指数的浮点来表示。(我相信Go语言需要使用具有二进制指数的IEEE fp格式。999.5 完全可以表示为 fp 值。


但是,我的测试(使用)表明,第一个解决方案对于从99.94999999到99.95000001的所有值都非常有效。第一个问题:我担心得不恰当。math.NextAfter()


第二种解决方案的问题在于,我担心可能会对其进行两次评估。第二个问题:是否有任何保证优化器将确保它只完成一次。f*10



呼唤远方
浏览 102回答 1
1回答

catspeake

如果您担心额外的乘法,而不是依赖优化器,则可以通过以下方式将其拉出:func r(f float64) float64 {    if f >= 999.5 {        return math.Round(f)    }        f *= 10    if f >= 999.5 {        return math.Round(f) / 10    }        f *= 10    return math.Round(f) / 100}
随时随地看视频慕课网APP

相关分类

Go
我要回答