gpt4 book ai didi

go - 如何正确将999999999.99999999转换为整数

转载 作者:行者123 更新时间:2023-12-01 22:42:45 24 4
gpt4 key购买 nike

我的浮点数为999999999.99999999,我想将浮点数转换为整数。
我预期结果为99999999999999999,但得到了100000000000000000
为什么?)

import (
"github.com/shopspring/decimal"
"log"
)

func MultiplyFloatToInt(value float64, multiplier int64) (result int64) {
return decimal.NewFromFloat(value).Mul(decimal.NewFromFloat(float64(multiplier))).IntPart()
}

func main() {
bigFloat := float64(999999999.99999999)

multilayer := float64(100000000)

log.Println(bigFloat)
log.Println(int64(bigFloat * multilayer))
log.Println(MultiplyFloatToInt(bigFloat, int64(multilayer)))
}


https://play.golang.org/p/_1rmUkjf9Nr

最佳答案

将任何浮点数转换为整数将始终产生整数。我不确定您是否期望输出十进制数,或者输入了错误的问题。

您的示例向上舍入的原因已在其他答案和注释中进行了解释,并且与您输入的值超出float64的精度有关。如果从示例中删除九分之一并重播,您将发现该值未向上取整。

当处理超出float64限制的数字时,可以使用math / big库。

这样的事情应该会给您期望的结果。

package main

import (
"math/big"
"log"
)

func main() {
bigFloatStr := "999999999.99999999"
bigFloat, _ := new(big.Float).SetString(bigFloatStr)

multiplier := new(big.Float).SetInt64(100000000)

result := new(big.Float)
result.Mul(bigFloat, multiplier)

bigInt := new(big.Int)
result.Int(bigInt)

intVal := bigInt.Int64()

log.Println(bigFloat)
log.Println(result)
log.Println(bigInt)
log.Println(intVal)
}

输出:
2009/11/10 23:00:00 9.9999999999999999e+08
2009/11/10 23:00:00 9.9999999999999999e+16
2009/11/10 23:00:00 99999999999999999
2009/11/10 23:00:00 99999999999999999

https://play.golang.org/p/w4fMuPE1ADf

关于go - 如何正确将999999999.99999999转换为整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61054106/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com