Go 大的,浮球,奇怪的行为

Go 大的,浮球,奇怪的行为,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,

在使用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, 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四舍五入。四舍五入到最近值,与偶数关联–四舍五入到最近值;如果数字中途下降,则使用偶数(零)最低有效位四舍五入到最接近的值