我们现有的应用程序从文件中读取一些浮点数。这些数字是由其他一些应用程序(称为应用程序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可以通过两种方式获取它保存的值:
最佳答案
不,你不知道。 float
和double
都不能精确表示3/250。您得到的是一个由字符串格式化程序Double.ToString()
呈现为"0.012"
的值。但这是因为格式化程序没有显示确切的值。
通过decimal
会导致舍入。仅将Math.Round
与所需的舍入参数一起使用可能会更快(更不用说更容易理解了)。如果您关心的是有效位数,请参阅:
对于它的值(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。