Ben*_*Non 9 .net c# math floating-point double
我正在为一个学校项目(自行车工厂)编制一个股票/生产计划,我必须围绕一些数字,例如必须生产的自行车(由于后果是双打).
如果我使用以下代码:
double test = Math.Ceiling(100 * 1.09);
label75.Text = Convert.ToString(test);
Run Code Online (Sandbox Code Playgroud)
我得到答案110,但那不对,它应该是109(100%的9%).虽然它似乎适用于低于9%的值.
我究竟做错了什么?
p.s*_*w.g 28
doubles和floats是二进制浮点类型.这意味着它们不能精确地表示许多十进制数字(如1.09).这导致一些微妙的舍入错误.在你的情况下,100*1.09实际上导致一个非常大于109的数字,所以Ceiling函数正确地将它舍入到最接近的整数110.
将其更改为a decimal,您将获得预期的结果:
decimal test = Math.Ceiling(100 * 1.09m); // 109
Run Code Online (Sandbox Code Playgroud)
请注意,min 1.09m将其标识为decimal文字.这是有效的,因为该decimal类型专门设计用于表示十进制数(而不仅仅是它们的二进制近似,as double和floatdo).
浮点运算不在基数10中,它在基数2中.该double类型没有精确的基数-2等价1.09
为了说明,如果您在以下程序的末尾加上一个断点
public static void Main()
{
double test = 100 * 1.09;
}
Run Code Online (Sandbox Code Playgroud)
比test出现的那样109.00000000000001