当我尝试将大数字存储到像float varr = 123456789;
这样的浮点数时,变量varr
的值为123456792.0
而非123456789.0
,正如我预期的那样。为什么呢?
有没有解决方案?
我不能使用double或decimal,因为我被限制在内存中的4个字节。
答案 0 :(得分:1)
这是因为float变量的精度有限。请改用double。
正如你在这里看到的,float只有7位精度,而double只有13位: http://msdn.microsoft.com/en-us/library/b1e65aza%28v=vs.80%29.aspx
有四个字节的内存,你可以表达约。 40亿个不同的值,即带有9位数的十进制数。您必须问自己,您要显示的数字是否适合该范围。例如。如果要存储0到999 999 999的数字,则四个字节就足够了。如果您的数字从1 000 000 000到1 999 999 999那么它也足够了。在这种情况下,您需要通过减去1 000 000 000将输入数字(一个双精度数)转换为整数。当读取该值时,您可以执行反转。
此原则可以扩展为以更低的精度显示数量或更大范围的其他范围。但是你必须自己编写转换代码。
答案 1 :(得分:1)
答案 2 :(得分:0)
float
类型的精度意味着此限制。您可以改为使用double
类型。
float
类型符合IEEE 754-2008 binary32 format (Single-precision floating-point format)
来自Wikipedia:
顺便说一句,我没有得到你的结果。我运行这段代码:IEEE 754标准将binary32指定为:
- 符号位:1位
- 指数宽度:8位
- 显着精确度:24(明确存储23个)
这给出了6到9个有效十进制数字的精度(如果a 最多6个有效小数的十进制字符串转换为IEEE 754单精度然后转换回相同的数量 有效小数,则最终字符串应与原始字符串匹配; 如果IEEE 754单精度转换为十进制字符串 至少有9个有效小数,然后转换回单个, 然后最后的号码必须与原件相符。
签名位 确定数字的符号,这是符号 有意义的。指数是来自的8位有符号整数 -128到127(2的补码)或从0到0的8位无符号整数 255是IEEE 754 binary32定义中可接受的偏置形式。 对于这种情况,指数值127表示实际零。该 真有效数包括二进制右边的23个小数位 点和隐式前导位(在二进制点的左侧) 值为1,除非指数全部存储为零。因此只有 有效数的23个小数位出现在存储器格式中但是 总精度为24位(相当于log10(224)≈7.225 十进制数字)。
float varr = 123456789;
Console.WriteLine(varr.ToString("#"));
我的输出是123456800
。
答案 3 :(得分:0)
如果您可以使用32位整数(4个字节)的整数(int
),则可以存储该数字,并且您不会遇到任何精度问题。