你所说的正在发生的事情似乎没有发生。
这个程序:
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
float f = 1.2999f;
Console.WriteLine(f);
Decimal d = Convert.ToDecimal(f);
Console.WriteLine(d);
}
}
}
印刷:
1.2999
1.2999
我认为将值转换为字符串时可能会遇到问题。
或者,正如 ByteBlast 在下面指出的那样,也许您给了我们错误的测试数据。
使用float f = 1.2999999999f;
确实打印1.3
原因是浮点值不够精确,无法准确表示1.299999999f
。该特定值最终被四舍五入1.3
- 但请注意,它是在转换为小数之前被四舍五入的浮点值。
如果您使用 adouble
而不是 a ,除非您达到更高的精度位数(当您达到)float
,否则不会发生这种情况1.299999999999999
[编辑]根据您修改后的问题,我认为这只是预期的舍入错误,因此请务必阅读以下内容:
有关详细信息,请参阅“每位计算机科学家应了解的浮点运算知识”。
另请参阅此链接(由 Tim Schmelter 在下面的评论中推荐)。
要注意的另一件事是,调试器显示的数字可能与默认double.ToString()
(或等效)的精度级别不同,因此可能会导致您看到略有不同的数字。
在旁边:
您可能对“往返”格式说明符有一些运气:
Console.WriteLine(1.299999999999999.ToString());
Prints 1.3
但:
Console.WriteLine(1.299999999999999.ToString("r"));
Prints 1.2999999999999989
(请注意倒数第二位的狡猾的小8!)
为了获得最终精度,您可以使用type Decimal
,就像您已经在做的那样。这针对以 10 为底的数字进行了优化,并提供了更多位数的精度。
float
但是,请注意,它比or慢数百倍,double
并且它也可能遭受舍入错误,尽管要少得多。