因此,当我尝试运行这段代码时,为什么我会打印2。每个Decimal是否转换为long然后求和(1 + 1为2)或者是整个Decimal首先求和然后舍入(2.5应该是3)。奇怪的是,当我将x的值更改为1.26时,打印的值为3.当然,2.51应该舍入到3,但是根据该逻辑,不应该2.5也会向上舍入?
MbusTcpSlaveProtocol.hpp
谢谢!
答案 0 :(得分:2)
您假设以0.5结尾的分数将被舍入不正确。它们四舍五入到最接近的偶数整数(因此2.5轮到2轮,但3.5轮到4轮)。这称为Bankers Rounding。您可以使用MidpointRounding Math.Round选项强制0.5向上舍入。请注意,在Math.Round
类型上使用Decimal
会返回Decimal
,因此您仍需将其转换为Long
。
以下代码将使用Option Strict On
进行编译,并在控制台上显示“3”。
Dim x As Decimal = 1.25D
Dim y As Decimal = 1.25D
Dim z As Long = CLng(Math.Round(x + y, 0, MidpointRounding.AwayFromZero))
Console.WriteLine(z)
答案 1 :(得分:1)
将以下内容作为测试。 z出来3,J出来2.所以public void verifyPassword(String password, Person person) {
if (isBusinessClient(person)) {
// Apply strict wiring
PasswordChecker checker = new PasswordChecker();
passwordChecker.check(password)
} else if (wasBusinessClient(person)) {
// Apply normal wiring
PasswordChecker checker = new PasswordChecker();
passwordChecker.check(password)
} else {
// Apply lax wiring
PasswordChecker checker = new PasswordChecker();
passwordChecker.check(password)
}
}
似乎已将两者加在一起然后转换。而如果你单独转换它们并添加它们就会得到不同的结果
Dim z As Long = CLng(x + y)