C# 数学

C# Mathemathics

我想问一个关于我今天在 C# 中进行的计算的问题。

double expenses = (pricePen + priceMark + priceLitres) - discount / 100*(pricePen + priceMark + priceLitres); //Incorrect

double expenses = (pricePen + priceMark + priceLitres) - (pricePen + priceMark + priceLitres)* discount/100;   //Correct 

因此,正如您在等式末尾看到的那样,我不得不将方括号乘以名为“discount”的整数,这显然是折扣百分比。

当我更改该值的位置时,无论它是在括号前还是在括号后,答案总是不同的,但在数学中我什至检查过自己,我应该得到相同的答案,即使value放在括号前面乘还是放在括号后面再乘,但是C#不这么认为

我想问问大家,C# 是如何计算的,为什么我最后会得到不同的结果? (结果应该是 28.5,不是 38)

[Data: pricePen = 11.6; priceMark = 21.6;  priceLitres = 4.8; discount = 25;]

(我知道这个问题无关紧要。)

第一行除以 100 后的结果是一个整数。为此,其余部门迷路了。所以乘法的结果较低。
在第二行乘法有正确的结果,除法的其余部分小于一。

要避免这些问题,请确保您使用浮点类型而不是 int 类型进行数学运算。在你的情况下 discount 是一个 int 因此

x * (discount / 100) = x * <integer>

最好定义一个函数来进行强制类型的计算

double DiscountedPrice(double price, double discount)
{
    return price - (discount/100) * price;
}

然后称其为

var x = DiscountedPrice( pricePen + priceMark + priceLitres, 15);

在上述场景中,编译器会强制将整数 15 转换为双精度作为 加宽 转换(双精度的位数多于整数)。

所以我知道它已经回答了,但是如果你想了解更多关于 int 的除法 这里是:

例如:

float value = 3/4 你会期望它是 0.75 但事实并非如此。

因为当编译器遍历值 3 和 4 时,他会生成最高数据类型的 des Literal - 在本例中为 (int)-。 这意味着该除法的结果将是 "0".75 因为 int 没有浮点数,只是将其截断。然后程序只获取该值并将其放入 float value ... 所以结果将是

"3/4" 0 ->"浮点值" 0.0 = 0.0

我之前的一些人已经告诉过你解决这个问题的方法,比如让一个除数随 .0 浮动

float value = 3.0/4

或者您可以使用 (float) "command"

告诉编译器将值存储在浮点文字中
float value = (float) 3/4

我希望它能帮助你解释你为什么这样做:)