一切都始於這些代碼簡單的線條後:字符串轉換爲與2位數字的兩倍小數點分隔
string s = "16.9";
double d = Convert.ToDouble(s);
d*=100;
結果應該是1690.0,但事實並非如此。 d等於1689.9999999999998。 我想要做的就是在小數點分隔符後用2位數舍入一個double值。 這是我的功能。
private double RoundFloat(double Value)
{
float sign = (Value < 0) ? -0.01f : 0.01f;
if (Math.Abs(Value) < 0.00001) Value = 0;
string SVal = Value.ToString();
string DecimalSeparator = System.Globalization.CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator;
int i = SVal.IndexOf(DecimalSeparator);
if (i > 0)
{
int SRnd;
try
{
// вземи втората цифра след десетичния разделител
SRnd = Convert.ToInt32(SVal.Substring(i + 3, 1));
}
catch
{
SRnd = 0;
}
if (SVal.Length > i + 3)
SVal = SVal.Substring(0, i + 3);
//SVal += "00001";
try
{
double result = (SRnd >= 5) ? Convert.ToDouble(SVal) + sign : Convert.ToDouble(SVal);
//result = Math.Round(result, 2);
return result;
}
catch
{
return 0;
}
}
else
{
return Value;
}
但是,同樣的問題,從字符串轉換爲double不起作用,因爲我想。 解決此問題的方法是將「00001」連接到字符串,然後使用Math.Round函數(在上面的示例中進行了註釋)。
該雙倍值乘以100(作爲整數)發送到設備(收銀機),並且此值必須正確。
我使用VS2005 + .NET CF 2.0
是否有另一個更「優雅」的解決方案,我不滿意這點之一。
另一天,另一個人浮點失敗:( – leppie 2009-10-19 10:46:53
它看起來像一個重複的問題。不知道我記得我在哪裏看到它。 – 2009-10-19 10:48:33
這是一個很常見的事情,所以一定會有幾個重複在這個網站上,但我認爲找到它們更有效,而不僅僅是爲了回答,所以很好。:) – Joren 2009-10-19 11:14:55