【发布时间】:2019-02-28 07:22:40
【问题描述】:
我有以下情况
beleg.PreisDB = (double?)orders.Where(x => x.orderId == beleg.auftrnr).Sum(x => x.itemPrice + x.shippingPrice + x.giftWrapPrice) ?? 0;
beleg.PreisCouponDB = (double?)orders.Where(x => x.orderId == beleg.auftrnr).Sum(x => x.itemPromotionDiscount + x.shipPromotionDiscount) ?? 0;
var gesamtPreis = Math.Round(beleg.PreisDB??0 + beleg.PreisCouponDB??0, 2);
在我的案例中,我在某些字段的调试中添加了一个快速监视:
beleg.PreisDB == 8.39
beleg.PreisDB??0 == 8.39
beleg.PreisCouponDB == -0.49
beleg.PreisCouponDB??0 == -0.49
现在奇怪的行为也来自快速观察,当然还有结果
beleg.PreisDB??0 + beleg.PreisCouponDB??0 == 8.39
Math.Round(beleg.PreisDB??0 + beleg.PreisCouponDB??0, 2) == 8.39
gesamtPreis == 8.39
所以加上 8.39 + -0.49 不是 7.9 而是 8.39 该代码在至少两个上运行了 60 万个案例,我有这种行为,其他人表现良好。我现在看不到我的错误。问题是.net 为什么会这样?我正在使用带有 .net 4.5.2 的 Visual Studio 2015。
【问题讨论】:
-
您是否在调试器外部看到了这个?我已经看到调试器无法按预期工作的许多问题,但如果您可以在 minimal reproducible example 中显示此问题而不使用调试器,那将更加出乎意料并且更容易为您提供帮助。
-
说了这么多,我想我也许能看出哪里出了问题——我需要检查一下……
-
我已将问题作为重复项关闭;有关
??的优先级可能令人惊讶的其他方式,请参阅stackoverflow.com/questions/3218140。 -
你这里的逻辑和“
1+2是3和4+1是5是一样的,所以1 + 2 * 4 + 1是15。既然我得到了答案10,乘法必须被打破。不,在组合运算时必须在运算周围加上括号。(1+2)*(4+1)是 15。