你说的是发生似乎并没有发生什么事。
这个程序:
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
- 但请注意,这是一个正在四舍五入之前转换为十进制浮点价值。
如果使用double
代替float
,这种情况不会发生,除非你去甚至更精确的数字(当你到达1.299999999999999
)
根据修改后的问题[编辑] ,我想它只是预期的舍入误差,所以肯定阅读以下内容:
详见"What Every Computer Scientist Should Know About Floating-Point Arithmetic"。
Also see this link(由Tim Schmelter在下面的评论推荐)。
另一件需要注意的事情是,调试器可能会显示不同的精度级别的数字,其默认级别为double.ToString()
(或等效),因此可能会导致您看到稍微不同的数字。
旁白:
你可能有一些运气的 “往返” 格式说明:
Console.WriteLine(1.299999999999999.ToString());
Prints 1.3
但是:
Console.WriteLine(1.299999999999999.ToString("r"));
Prints 1.2999999999999989
(需要注意的是偷偷摸摸的小8日倒数第二位!)
为了获得最终精度,您可以使用the Decimal
type,因为您已经在做这些。这为基数为10的数字进行了优化,并提供了更多的精度数字。
但是,请注意,它比float
或double
慢几百倍,并且它也可能遭受舍入误差,尽管少得多。
它应该有效。 – 2013-04-22 12:27:31
@HseseinNarimaniRad同意。它不会在我的机器上四舍五入。 – 2013-04-22 12:27:52
无法重现。 'Console.WriteLine(Convert.ToDecimal(1.2999));'打印'1.2999'。 – Heinzi 2013-04-22 12:28:28