我现在有这段代码:
totalCost = fuelPrice * purchaseVolume;
totalCost = Math.Round(totalCost, 2);
Console.WriteLine("Total Cost = £" + totalCost);
Run Code Online (Sandbox Code Playgroud)
如果燃油价格为1.15且成交量为2,console.writeline则表示总成本为2.3英镑,而不是我想要达到的2.30.我究竟做错了什么?
我们正在进行财务计算.我发现这篇关于存储货币值为小数的帖子:十进制vs双! - 我应该使用哪一个?何时使用?
所以我将金额存储为小数.
我有以下计算:12.000*(1/12)= 1.000
如果我使用十进制数据类型来存储金额和结果金额,我得不到预期的结果
// First approach:
decimal ratio = 1m / 12m;
decimal amount = 12000;
decimal ratioAmount = amount * ratio;
ratioAmount = 999.9999999999999
// Second approach:
double ratio = 1d / 12d;
decimal amount = 12000;
decimal ratioAmount = (decimal)((double)amount * ratio);
ratioAmount = 1.000
// Third approach:
double ratio = 1d / 12d;
double amount = 12000;
double ratioAmount = amount * ratio;
ratioAmount = 1.000
Run Code Online (Sandbox Code Playgroud)
什么是最好的方法?每个人都在谈论金额/金钱必须存储为小数.
我可能完全错了,我对此一无所知,但我对编程语言中的十进制数字数据有疑问.我知道浮点数并不完全精确,因为它们以二进制形式存储有权或其他东西,但我总是想知道为什么十进制数数据类型不只是存储一个数字就像没有小数一样,所以做计算就像如果没有小数,则在之后添加.就像在这种情况下:
2.159 * 3.507 --> 2159 * 3507 = 7571613
^^^ ^^^
123 456
6 decimals in total... 7571613 -> 7.571613
^^^^^^
654321
Run Code Online (Sandbox Code Playgroud)
所以2.159*3.507 = 7.571613
为什么它不能像那样工作?
我想添加0.01到36.01并得到36.02作为结果但是下面的代码返回36.019999999999994.
Double d = 36.01;
d = d + 0.01;
Run Code Online (Sandbox Code Playgroud)
谁能告诉我如何得到36.02作为结果?提前致谢
为什么这个代码 http://ideone.com/YRcICG
void Main()
{
double a = 0.00004;
Int32 castToInt = (Int32)(1.0/a);
Int32 convertToInt = Convert.ToInt32(1.0/a);
Console.WriteLine("{0} {1:F9} {2:F9}", castToInt == convertToInt, castToInt, convertToInt);
Console.WriteLine((((int)(1.0/(1.0/25000))) == 24999));
}
Run Code Online (Sandbox Code Playgroud)
结果是
错24999,000000000 25000,000000000
真
在CLR/C#实现的上下文中
一个非常奇怪的,可能意味着Visual Studio 2012的有用行为.当我在vb.net中输入double时,如:
Dim myD as Double = 1.4
Run Code Online (Sandbox Code Playgroud)
当我按下Enter键以另一种方式移动我的焦点时,格式化开始并将上面的内容更改为:
Dim myD as Double = 1.39999999999999998
Run Code Online (Sandbox Code Playgroud)
或1.6作为
Dim myD as Double = 1.6000000000000001
Run Code Online (Sandbox Code Playgroud)
所有双打似乎都不会发生此行为.1.3,1.5,1.7和1.8请看这个youtube电影中的行为:http: //youtu.be/afw4jg58-aU
为什么,更重要的是,我该如何防止这种情况?
编辑:
安装的扩展程序是:

第二次编辑
这种行为似乎消失了.我不知道是什么造成了这种情况,以便将来参考,这对任何人都没用,但就目前而言,我很高兴我没有按照建议进行故障排除.
您好我现在正在使用C#和.NET Framework书进行计算,而我在其中一个练习中遇到了困难
编写C#程序进行更改.输入小于一美元的项目的成本.输出硬币作为更改,使用季度,硬币,镍币和硬币.尽可能使用最少的硬币.例如,如果该项目花费17美分,则变化将是四分之三,一个镍和三个便士
由于我还在尝试掌握c#编程,我提出的最佳方法是使用while循环.
while(costOfItem >= 0.50)
{
costOfItem -= 0.50;
fiftyPence++;
}
Run Code Online (Sandbox Code Playgroud)
我为每个笔20,10,5等都有这些.我正在检查金额是否大于或等于50便士,如果是这样,我从用户给出的金额减少50便士并加1 fiftypence变量.
然后它移动到下一个while循环,我对每个pences都有.问题是,沿着线路的某个环路消失,比如20便士,而costOfItem变成类似"0.1999999999999"的东西,然后它永远不会下降到0,它应该得到正确的变化量.
任何帮助表示赞赏,请不要建议我已经涵盖的复杂程序.
考虑以下代码:
double d = 1478110092.9070129;
decimal dc = 1478110092.9070129M;
Console.WriteLine(d.ToString("R"));
Console.WriteLine(dc);
Console.WriteLine(Convert.ToDouble(dc).ToString("R"));
Console.WriteLine(double.Parse(dc.ToString()).ToString("R"));
Run Code Online (Sandbox Code Playgroud)
这会生成以下内容:
1478110092.9070129
1478110092.9070129
1478110092.9070127
1478110092.9070129
Run Code Online (Sandbox Code Playgroud)
我的问题是 Convert.ToDouble 发生了什么?显然这个数字可以用双精度数来表示?
我正在搞乱傅立叶变换.现在我已经创建了一个实现DFT实现的类(没有像FFT atm这样做).这是我用过的实现:
public static Complex[] Dft(double[] data)
{
int length = data.Length;
Complex[] result = new Complex[length];
for (int k = 1; k <= length; k++)
{
Complex c = Complex.Zero;
for (int n = 1; n <= length; n++)
{
c += Complex.FromPolarCoordinates(data[n-1], (-2 * Math.PI * n * k) / length);
}
result[k-1] = 1 / Math.Sqrt(length) * c;
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
这些是我得到的结果 Dft({2,3,4})

好吧,看起来还不错,因为那些是我期望的值.我发现只有一件事令人困惑.这一切都与双打的四舍五入有关.
首先,为什么前两个数字不完全相同(0,8660..443 8)vs(0,8660..443).为什么它不能计算零,你期望它.我知道2.8E-15非常接近于零,但事实并非如此.
任何人都知道这些,边缘的错误是如何发生的,如果我能够并且想要对它做些什么.
似乎没有真正的问题,因为它只是小错误.但是,如果您要比较2个值,那么如何处理这些舍入误差.
5,2 + 0i != 5,1961524 …Run Code Online (Sandbox Code Playgroud) 我有一个来自 csv 文件的字符串,看起来像这样 ""711,200.00"" 我试图用这个代码将该数字转换为双精度
collaterel.LoanQty = double.Parse(values[25], CultureInfo.InvariantCulture);
Run Code Online (Sandbox Code Playgroud)
我已经去掉了逗号并尝试转换为双精度,但我仍然得到输入字符串的格式不正确
这是我用来去掉逗号的
if (values[25].Contains(","))
{
values[25] = values[25].Replace(",", "");
}
Run Code Online (Sandbox Code Playgroud)
我尝试了很多文化,但仍然失败。
带有cultureinfo 的屏幕截图double.parse 不起作用