程序行为在不同系统上是不同的。为什么?

时间:2013-09-21 07:18:31

标签: c#

这是我的程序代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace YourGold
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Welcome to YourGold App! \n------------------------");
            Console.WriteLine("Inesrt your gold: ");
            int gold;
            while (!int.TryParse(Console.ReadLine(), out gold))
            {
                Console.WriteLine("Please enter a valid number for gold.");
                Console.WriteLine("Inesrt your gold: ");
            }
            Console.WriteLine("Inesrt your time(In Hours) played: ");
            float hours;
            while (!float.TryParse(Console.ReadLine(), out hours))                
                    {
                        Console.WriteLine("Please enter a valid number for hours.");
                        Console.WriteLine("Inesrt your hours played: ");
                    }
                    float time = ((int)hours) * 60 + (hours % 1) * 100; ; // Here the calculation are wrong...
                    Console.WriteLine("Your total time playd is : " + time + " minutes");
                    float goldMin = gold / time;
                    Console.WriteLine("Your gold per minute is : " + goldMin);
                    Console.WriteLine("The application has ended, press any key to end this app. \nThank you for using it.\n but no thanks");
                    Console.ReadLine();

                    //Console.WriteLine(" \nApp self destruct!");
                    //Console.ReadLine();

        }
    }
}

当我尝试使用我的本地Visual Studio环境运行它时,我在控制台中看到minutes的输出在900小时内传入程序时等于1.5

如果我在www.ideone.com上运行此操作,我会看到相同值90 minutes的输出为1.5

我的代码在哪里可能出错? 为什么在不同的地方运行我的程序行为会有所不同?

1 个答案:

答案 0 :(得分:7)

我强烈怀疑当你在本地运行时,你处于一种文化,其中,是小数点分隔符而不是. - 也许.是千位分隔符,基本上被忽略了。所以1.5最终被解析为15小时,即900分钟。

要验证这一点,请尝试输入1,5 - 我怀疑您将获得90的结果。

如果要强制执行.为小数点分隔符的设置,只需将文化传递到float.TryParse

while (!float.TryParse(Console.ReadLine(), NumberStyles.Float,
                       CultureInfo.InvariantCulture, out hours))

请注意,您不需要自己完成所有算术 - 使用TimeSpan为您完成此操作。

int minutes = (int) TimeSpan.FromHours(hours).TotalMinutes;