[英]C# assuming floating point literals are of type double?
我正在使用我的C#教科書,它說“C#假定所有浮點文字都是double類型。” 我得到了這個說法,但我不太確定如何將修復程序應用於我正在處理的示例程序。
using System;
using System.Collections.Generic;
using System.Text;
namespace CoinCounter
{
class Program
{
static void Main(string[] args)
{
int quarters;
int dimes;
int nickels;
int pennies;
float myTotal = 0F;
Console.Out.WriteLine("How many quarters are in the jar?");
quarters = int.Parse(Console.In.ReadLine());
Console.Out.WriteLine("How many dimes are in the jar?");
dimes = int.Parse(Console.In.ReadLine());
Console.Out.WriteLine("How many nickels are in the jar?");
nickels = int.Parse(Console.In.ReadLine());
Console.Out.WriteLine("How many pennies are in the jar?");
pennies = int.Parse(Console.In.ReadLine());
myTotal = (quarters * .25) + (dimes * .10) + (nickels * .05) + (pennies * .01);
Console.Out.Write("\nTotal: " + myTotal.ToString("c"));
Console.In.ReadLine();
}
}
}
它回來說:“不能隱式地將類型'double'轉換為'float'。” 當我試圖將整個myTotal行放在括號中並在末尾添加一個F表示它正在尋找一個';'。
所以我的問題是,我如何使用浮動? 如何在此末尾添加F? 我也試過以不同的方式在它前面鑄造(浮動)。
感謝您的時間。
你這里有一個更大的問題。 您永遠不應將金融數量表示為浮點數或雙精度數 。 C#有一種專門用於表示金融數量的類型:十進制。
你的代碼應該是
decimal myTotal = 0.00m;
...
myTotal = (quarters * .25m) + (dimes * .10m) + (nickels * .05m) + (pennies * .01m);
記住這個的方法:“我是為了錢”。
此外,在我們使用它時,在將用戶輸入轉換為數字時使用TryParse; 用戶可能會鍵入不是數字的內容,然后您將獲得異常。
語言不會隱式執行轉換,因為它會導致精度損失。 但是,您可以使用強制轉換顯式執行轉換:
myTotal = (float)(
(quarters * .25)
+ (dimes * .10)
+ (nickels * .05)
+ (pennies * .01)
);
在這種情況下,你知道你沒有處理天文數量或精確的高精度,所以這應該沒問題。
您還可以通過指定浮點文字而不是雙精度來阻止自動將值提升為double:
myTotal = (quarters * .25F)
+ (dimes * .10F)
+ (nickels * .05F)
+ (pennies * .01F);
...對於加法運算, int
變量將被提升為float
,因此您將使用float
而不是double
類型作為結果。
myTotal = (quarters * .25f) + (dimes * .10f) + (nickels * .05f) + (pennies * .01f);
這應該做到這一點。
將int乘以float => float結果
在您的版本中,int * double(默認值)=> double results => double total。
嘗試將其分配給float var,編譯器抱怨double to float conversion必須是顯式的(精度損失)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.