GO:操纵随机生成的float64

时间:2014-01-19 18:10:12

标签: random numbers go generated

我想知道我们是否可以指定随机生成器在点小数点后应该生成多少个数字?

默认行为示例:

fmt.Println(rand.float64())

会打印出数字0.6046602879796196

期望的行为:

fmt.Println(rand.float64(4))

然后打印出数字0.6047。

GO中是否已存在此功能,或者我是否必须自行实施?

谢谢!

2 个答案:

答案 0 :(得分:2)

听起来只有字符串表示对您很重要,fmt包确实为您提供:

fmt.Printf("%1.4f", rand.Float64())

所以是的,您仍然需要包装此调用以指定小数点后的位数。

func RandomDigits(number int) string {
    return fmt.Sprintf("%1." + strconv.Itoa(number) + "f", rand.Float64())
}

答案 1 :(得分:2)

我不知道这样的功能,但是你自己很容易实现(play):

// Truncate the number x to n decimal places
//
// +- Inf -> +- Inf; NaN -> NaN
func truncate(x float64, n int) float64 {
    return math.Trunc(x * math.Pow(10, float64(n))) * math.Pow(10, -float64(n))
}

将数字n小数位移到左侧,截断小数位,将数字n位置向右移动。

如果您想向用户显示您的号码,那么您将在某一时刻转换该号码 到一个字符串。当您这样做时,您不应该使用此方法,而是使用指向的字符串格式 由Tyson出来。例如,由于浮点数不精确,可能存在舍入误差:

truncate(0.9405090880450124,3) // 0.9400000000000001