2017-10-16 46 views
1

我應該編寫一個程序,輸入是double(變量叫money),我應該分別打印小數點前面的數字和後面的數字。 例如:在c#中提取小數點後面的數字

爲輸入:36.5應打印:The number before the decimal point is: 36 The number after decimal point is: 5

爲輸入:25.4應打印:The number before the decimal point is: 24 The number after decimal point is: 4

Console.WriteLine("Enter money:"); 
      double money = double.Parse(Console.ReadLine()); 
      int numBeforePoint = (int)money; 
      double numAfterPoint = (money - (int)money)*10; 
      Console.WriteLine("The number beforethe decimal point is: {0}. the number after the decimal point is: {1}",numBeforePoint,numAfterPoint); 

如果我進入25.4它打印:The number before the decimal point is: 24 The number after decimal point is: 3.9999999

我不想要3.999999我想4

+4

您不應該使用'double'作爲財務價值 - 使用'decimal'。浮點類型用於科學計算。不同的類型有不同的精度。 – xxbbcc

+0

hacky的解決方案 - 你可以使用math.round ... – AGrammerPro

+1

@AGrammerPro根本不hacky。 Math.Round通常用於糾正像這樣的浮點精度錯誤。 – BradleyDotNET

回答

3

您應該使用decimal來表示數字類型,而不是double s - 這是它們的設計目的!

你是個浮​​點錯誤,在那裏你分配給一個浮點值的價值無法精確憑藉其精確的代表的受害者(你得到的.999...是最接近的值就可以代表)。

decimal s的範圍低於double s,但精度要高得多 - 這意味着它們更有可能表示您正在分配的值。有關更多詳細信息,請參閱here或鏈接的decimal文檔頁面。

注意,得到小數部分的更傳統的方式包括Math.Truncate(其中的方式會爲負值以及工作):

decimal numAfterPoint = (money - Math.Truncate(money))*10; 
+0

儘管如此,你能否討論爲什麼這種類型可以解決這個問題? – BradleyDotNET

+0

@BradleyDotNET哎呀,你發現我中期編輯! – hnefatl

2

大概是最容易使用十進制的字符串表示,和在'。'的索引之前和之後使用子字符串。

事情是這樣的:

string money = Console.ReadLine(); 
int decimalIndex = money.IndexOf('.'); 
string numBeforePoint = money.Substring(0, decimalIndex); 
string numAfterPoint = money.Substring(decimalIndex + 1); 

然後您可以根據需要解析字符串表示。

+0

並非所有語言都使用'.'作爲分數分隔符。在某些語言中,它是''',並且可能有其他人我不知道。 – xxbbcc

+0

我知道,但海報暗示一段時間將是分隔符。 – akerra

+0

海報可能沒有意識到它有所作爲。 – xxbbcc

2

試試這個:

static string Foo(double d) 
     { 
      var str = d.ToString(CultureInfo.InvariantCulture).Split('.'); 
      var left = str[0]; 
      var right = str[1]; 
      return $"The number before the decimal point is: {left} The number after decimal point is: {right}"; 
     } 

希望這有助於!

+1

並非所有語言都使用'.'作爲分數分隔符。在某些語言中,它是''',並且可能有其他人我不知道。 – xxbbcc

+0

好點。 (Pun打算) – Ratatoskr

0
using System.Linq; 

public static string GetDecimalRemainder(double d) 
{ 
    return d.ToString(CultureInfo.InvariantCulture).Split('.').Last(); 
{ 

在我看來,使用LINQ更方便。