0

我有一个浮点数,比如说1.2999,当放入一个Convert.ToDecimal返回时1.3。我想将数字转换为小数的原因是加减时的精度,而不是四舍五入。我确信十进制类型可以保存该数字,因为它可以保存比浮点数更大的数字。

为什么要把数字四舍五入?有没有办法阻止它四舍五入?

编辑:我不知道为什么我的是四舍五入而你的不是,这是我的确切代码:

decNum += Convert.ToDecimal((9 * 0.03F) + 0);

我现在真的很困惑。当我进入调试器并查看(9 * 0.03F) + 0部件的输出时,它显示0.269999981为浮点数,但随后将其转换为十进制 0.27。但是我知道 9 的 3% 是 0.27。那么这是否意味着原始计算不正确,而转换只是在修复它?

该死的,我非常讨厌数字,哈哈!

4

1 回答 1

7

你所说的正在发生的事情似乎没有发生。

这个程序:

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并且它也可能遭受舍入错误,尽管要少得多。

于 2013-04-22T12:28:51.043 回答