【发布时间】:2012-05-01 09:05:02
【问题描述】:
类似这样的:
1234.5678
2345.6789
3456.7890
但不是:
123.4567
现在我这样做:
double number = Math.Ceiling ( random.NextDouble ( ) * 10000000 ) * 0.001;
但这并不总是给我 8 位数字。
有什么巧妙的技巧可以做到这一点?
【问题讨论】:
-
鉴于绝大多数小数在存储为双精度时没有精确表示,因此您确实应该使用 Decimal 类型。
-
均匀分布很重要吗?
-
@spender:你是什么意思?我只是将它们用作其他随机功能的播种机。这效率不高吗?
-
您要解决的问题是基于数字的十进制表示的问题。双精度数据类型不将其值存储为小数。它存储为二进制尾数和指数。使用这种表示可以完美表示的数字集与使用十进制表示可以完美存储的数字集是不同的。
-
来自en.wikipedia.org/wiki/Binary_numeral_system#Fractions_in_binary - 1/10 没有有限的二进制表示,这导致 10 × 0.1 在浮点运算中不精确等于 1。