我们现有的应用程序从文件中读取一些浮点数。这些数字是由其他一些应用程序(称为应用程序B)写入的。该文件的格式很久以前就已固定(我们无法更改)。在此文件中,所有浮点数均以二进制表示形式保存为浮点数(文件中为4个字节)。

在我们的程序中,一旦我们读取了数据,就将浮点数转换为 double 数,并在所有计算中都使用了 double 数,因为计算范围很广,并且我们担心舍入误差的扩散。

我们注意到,当我们通过十进制转换浮点数时(请参见下面的代码),与直接转换相比,我们得到的结果更加精确。注意:应用程序B还在内部使用 double 型,并且仅将它们作为浮点型写入文件中。假设应用程序B以浮点数的形式写入了文件0.012。如果我们在读取后将其转换为十进制然后再加倍,则将得到精确的0.012,如果直接将其转换为0.0120000001043081。

无需读取文件即可复制该文件-仅需分配以下内容即可:

    float readFromFile = 0.012f;
    Console.WriteLine("Read from file: " + readFromFile);
    //prints 0.012

    double forUse = readFromFile;
    Console.WriteLine("Converted to double directly: " + forUse);
    //prints 0.0120000001043081

    double forUse1 = (double)Convert.ToDecimal(readFromFile);
    Console.WriteLine("Converted to double via decimal: " + forUse1);
    //prints 0.012

从float转换为十进制的double总是有好处的,如果不是,在什么条件下有好处?

编辑:应用程序B可以通过两种方式获取它保存的值:
  • 值可以是计算的结果
  • 值可以由用户以小数形式输入(因此,在上面的示例中,用户在编辑框中键入了0.012,然后将其转换为double值,然后保存为float值)

    最佳答案



    不,你不知道。 floatdouble都不能精确表示3/250。您得到的是一个由字符串格式化程序Double.ToString()呈现为"0.012"的值。但这是因为格式化程序没有显示确切的值。

    通过decimal会导致舍入。仅将Math.Round与所需的舍入参数一起使用可能会更快(更不用说更容易理解了)。如果您关心的是有效位数,请参阅:

  • Round a double to x significant figures


  • 对于它的值(value),0.012f(这意味着最接近0.012的32位IEEE-754值)正好
    0x3C449BA6
    

    或者
    0.012000000104308128
    

    这完全可以表示为System.Decimal。但是Convert.ToDecimal(0.012f)不会给您确切的值(value)-每个the documentation there is a rounding step

    10-08 12:43