我有一个浮点值,如果超过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
catspeake
相关分类