Go 大的,浮球,奇怪的行为
在使用golang中的big.Float进行了一些计算之后,我将精度设置为2 即使是你,这个数字也只是一个简单的10,在设置了精度之后,它是8Go 大的,浮球,奇怪的行为,go,Go,在使用golang中的big.Float进行了一些计算之后,我将精度设置为2 即使是你,这个数字也只是一个简单的10,在设置了精度之后,它是8 package main import ( "fmt" "math/big" ) func main() { cost := big.NewFloat(10) fmt.Println("COST NOW", cost) perKWh := big.NewFloat(0) cost.Add(cost,
package main
import (
"fmt"
"math/big"
)
func main() {
cost := big.NewFloat(10)
fmt.Println("COST NOW", cost)
perKWh := big.NewFloat(0)
cost.Add(cost, perKWh)
fmt.Println("COST ", cost.String())
perMinute := big.NewFloat(0)
cost.Add(cost, perMinute)
fmt.Println("COST ", cost.String())
discountAmount := big.NewFloat(0)
cost.Sub(cost, discountAmount)
floatCos, _ := cost.Float64()
fmt.Println(fmt.Sprintf("COST FLOAT %v", floatCos))
cost.SetPrec(2)
fmt.Println("COST ", cost.String())
}
请查看此处的示例:
想从以下方面了解原因:
输入浮点值[…]
每个浮点值还具有精度、舍入模式和精度。精度是可用于表示值的尾数位数的最大值。舍入模式指定结果应如何舍入以适合尾数位,精度描述与精确结果相关的舍入误差 而
big.Float
在内部表示为:
sign × mantissa × 2**exponent
调用时,您设置的是尾数可用的位数,而不是数字十进制表示形式中的精度位数
您不能在尾数的两位中表示十进制10(1010二进制),因此它会四舍五入为十进制8(1000二进制),可以放入2位。至少需要三位来存储十进制10的101
部分。8可以放入一个尾数位,因此如果您说cost.SetPrec(1)
,您将看到相同的8
使用大软件包时,您需要考虑二进制文件。来自:
输入浮点值[…]
每个浮点值还具有精度、舍入模式和精度。精度是可用于表示值的尾数位数的最大值。舍入模式指定结果应如何舍入以适合尾数位,精度描述与精确结果相关的舍入误差 而
big.Float
在内部表示为:
sign × mantissa × 2**exponent
调用时,您设置的是尾数可用的位数,而不是数字十进制表示形式中的精度位数
您不能在尾数的两位中表示十进制10(1010二进制),因此它会四舍五入为十进制8(1000二进制),可以放入2位。至少需要三位来存储十进制10的101
部分。8可以放入一个尾数位,因此如果您说cost.SetPrec(1)
,您将看到相同的8
在使用大型软件包时,您需要考虑二进制代码。首先,丢弃所有不相关的代码。接下来,打印有用的诊断信息
package main
import (
"fmt"
"math/big"
)
func main() {
cost := big.NewFloat(10)
fmt.Println("Cost ", cost.String())
fmt.Println("Prec", cost.Prec())
fmt.Println("MinPrec", cost.MinPrec())
fmt.Println("Mode", cost.Mode())
cost.SetPrec(2)
fmt.Println("Prec", cost.Prec())
fmt.Println("Accuracy", cost.Acc())
fmt.Println("Cost ", cost.String())
}
输出:
Cost 10
Prec 53
MinPrec 3
Mode ToNearestEven
Prec 2
Accuracy Below
Cost 8
将10四舍五入到可以用符号、指数和2位尾数表示的最接近的偶数,得到8
四舍五入到EARESTEN,甚至是IEE754四舍五入。四舍五入到最近值,与偶数关联–四舍五入到最近值;如果数字降到一半,则会用偶数(零)最低有效位四舍五入到最接近的值。首先,丢弃所有不相关的代码。接下来,打印有用的诊断信息
package main
import (
"fmt"
"math/big"
)
func main() {
cost := big.NewFloat(10)
fmt.Println("Cost ", cost.String())
fmt.Println("Prec", cost.Prec())
fmt.Println("MinPrec", cost.MinPrec())
fmt.Println("Mode", cost.Mode())
cost.SetPrec(2)
fmt.Println("Prec", cost.Prec())
fmt.Println("Accuracy", cost.Acc())
fmt.Println("Cost ", cost.String())
}
输出:
Cost 10
Prec 53
MinPrec 3
Mode ToNearestEven
Prec 2
Accuracy Below
Cost 8
将10四舍五入到可以用符号、指数和2位尾数表示的最接近的偶数,得到8
四舍五入到EARESTEN,甚至是IEE754四舍五入。四舍五入到最近值,与偶数关联–四舍五入到最近值;如果数字中途下降,则使用偶数(零)最低有效位四舍五入到最接近的值