.NET中的大型浮点数(单个)数字

时间:2012-04-11 09:11:20

标签: .net floating-point

当我尝试将大数字存储到像float varr = 123456789;这样的浮点数时,变量varr的值为123456792.0而非123456789.0,正如我预期的那样。为什么呢?

有没有解决方案?

我不能使用double或decimal,因为我被限制在内存中的4个字节。

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)

如果您需要更高的精确度,可以使用doubledecimal 无论如何,请记住,浮点数总是近似的。

答案 2 :(得分:0)

float类型的精度意味着此限制。您可以改为使用double类型。

C#中的

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),则可以存储该数字,并且您不会遇到任何精度问题。