我想将double
转换为int
。但我很困惑。这是我的代码。
private void tbxDouble_TextChanged(object sender, EventArgs e)
{
tbxInt.Text = Convert.ToDouble(tbxDouble.Text).ToString("F0");
tbxInt2.Text = Math.Round(Convert.ToDouble(tbxDouble.Text),0).ToString();
}
100,5 =>的结果 101和 100
100,56 =>的结果 101和 101
100,49 =>的结果 100和 100
为什么所有结果都不是101?这有什么问题?
答案 0 :(得分:7)
编辑:正如在评论中指出的那样 - 当我写“F0”格式化只会截断数字时,我的初步答案是错误的。正确的答案是它会圆,但它会使用其他类型的舍入称为“远离零”四舍五入。
我认为100,49和100,56的案例是显而易见的,所以让我们来看看100,50
首先让我们退后一步:Convert.ToDouble(tbxDouble.Text)
此行从字符串转换为double,值为100.50
,此时您已完成两个不同的舍入。
第一个:
value.ToString("F0");
正在使用零舍入
第二个:
Math.Round(value, 0)
正在使用Bankers Rounding
银行家舍入将四舍五入到最接近的偶数数字 - 因此结果将为100.远离零舍入将舍入到101(101比零更“远离100”)
答案 1 :(得分:0)
如果要舍入到大于或等于的最小整数值,则必须使用Math.Ceiling
像这样的东西
class Program
{
static void Main(string[] args)
{
double v2 = 100.56;
double v3 = 100.49;
Console.WriteLine(Math.Ceiling(v2));
Console.WriteLine(Math.Ceiling(v3));
}
}
答案 2 :(得分:0)
我发现了错误。我们不应该使用Math.Round,因为有时结果是错误的。我们应该使用如下:
tbxInt3.Text = Math.Round(Convert.ToDouble(tbxDouble.Text), 0, MidpointRounding.AwayFromZero).ToString();
这是正确的结果:
100,5 =>的结果101
100,56 =>的结果101
100,49 =>的结果100