首页 > 解决方案 > Math.Truncate 的问题,将双精度数转换为整数

问题描述

首先,您现在应该是编程新手,英语不是我的母语,我来自德国。

我正在尝试编写一个程序,它告诉我已经过去了多少天、多少小时和多少分钟,最后是用户输入。对于用户输入,我有双变量(时间)和整数(天),在这个例子中,我输入了 14.40(它就像下午 2.40,在德国我们写成 14.40)和 2(星期二)。现在我想编写以下句子:“自星期一 1 日以来,已经过去了 14 小时 40 分钟!” 对此,他打印出“自星期一 1 日起,已过去 1440 小时零 0 分钟!”

为了拆分双倍,我使用 Math.Truncate 得到完整的小时数 (14),然后我从用户输入 (14.40) 中减去它,得到分钟数 (40)。

我在互联网上找不到该问题的解决方案,希望你们能帮助我。

在这张图片中,您可以看到我的代码和控制台

class Program
{
    static void Main(string[] args)
    {
        int day;
        double time;
        int VDays;
        double VHours;
        double VMinutes;

        Console.Write("Which day do we have? (1=Monday, 2=Tuesday, ...):\n");
        day = Convert.ToInt32(Console.ReadLine());
        Console.Write("Which time is it?\n");
        time = Convert.ToDouble(Console.ReadLine());

        VDays = day - 1;
        VHours = Math.Truncate(time);
        VMinutes = time - VHours;

        Console.WriteLine("Since Monday" + VDays + " Day, " + VHours + " Hours and " + VMinutes + " minutes have passed!");

        Console.ReadLine();
    }
}

标签: c#.netwindows

解决方案


经过测试,我可以确认这是Klaus Gütter提到的语言环境问题。

由于Convert.ToDouble使用您的德语区域设置并且逗号是德语中的小数分隔符,因此它会忽略点并将 14.40 解释为 1440。

您可以使用以下方法重新创建问题:

time = Convert.ToDouble(Console.ReadLine(), CultureInfo.GetCultureInfo("de-DE").NumberFormat);.

您可以指定用于解决问题的语言环境,这里使用InvariantCulture

time = Convert.ToDouble(Console.ReadLine(), CultureInfo.InvariantCulture);

您还需要将 VMinutes 乘以 100 才能工作,因为从时间中减去整数值会得到一个介于 0 和 1 之间的数字(即14.40 - 14 = 0.40, 0.40 * 100 = 40分钟已过)。


推荐阅读