相关疑难解决方法(0)

C#Double不受Math.Round的影响 - 为什么?

我现在有这段代码:

 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.我究竟做错了什么?

c#

3
推荐指数
1
解决办法
889
查看次数

财务计算:加倍还是小数?

我们正在进行财务计算.我发现这篇关于存储货币值为小数的帖子:十进制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)

什么是最好的方法?每个人都在谈论金额/金钱必须存储为小数.

.net c#

3
推荐指数
2
解决办法
440
查看次数

一般编程:十进制数,浮点数

我可能完全错了,我对此一无所知,但我对编程语言中的十进制数字数据有疑问.我知道浮点数并不完全精确,因为它们以二进制形式存储有权或其他东西,但我总是想知道为什么十进制数数据类型不只是存储一个数字就像没有小数一样,所以做计算就像如果没有小数,则在之后添加.就像在这种情况下:

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

为什么它不能像那样工作?

floating-point decimal-point

2
推荐指数
1
解决办法
2365
查看次数

添加后的小数位数太多

我想添加0.01到36.01并得到36.02作为结果但是下面的代码返回36.019999999999994.

Double d = 36.01;
d = d + 0.01;
Run Code Online (Sandbox Code Playgroud)

谁能告诉我如何得到36.02作为结果?提前致谢

c#

2
推荐指数
1
解决办法
163
查看次数

为何选择Convert.ToInt32(1.0/0.00004)!=(Int32)(1.0/0.00004)

为什么这个代码 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#实现的上下文中

c# math clr casting .net-4.0

2
推荐指数
1
解决办法
294
查看次数

如果我在vb.net中输入数字,Visual Studio 2012会为我的double值添加数字

一个非常奇怪的,可能意味着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

为什么,更重要的是,我该如何防止这种情况?

编辑:

安装的扩展程序是: 在此输入图像描述

第二次编辑

这种行为似乎消失了.我不知道是什么造成了这种情况,以便将来参考,这对任何人都没用,但就目前而言,我很高兴我没有按照建议进行故障排除.

vb.net double code-formatting visual-studio-2012

2
推荐指数
1
解决办法
523
查看次数

计算给定的总变化量

您好我现在正在使用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,它应该得到正确的变化量.

任何帮助表示赞赏,请不要建议我已经涵盖的复杂程序.

c# loops while-loop

2
推荐指数
1
解决办法
753
查看次数

Convert.ToDouble(decimal) 意外损失精度

考虑以下代码:

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 发生了什么?显然这个数字可以用双精度数来表示?

c#

2
推荐指数
1
解决办法
705
查看次数

傅里叶变换舍入误差

我正在搞乱傅立叶变换.现在我已经创建了一个实现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)

c# floating-point double fft

1
推荐指数
1
解决办法
589
查看次数

使用双精度解析字符串并获取错误输入字符串的格式不正确

我有一个来自 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 不起作用

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

c# csv

1
推荐指数
1
解决办法
43
查看次数