相关疑难解决方法(0)

.NET中的decimal,float和double之间的区别?

是什么区别decimal,floatdouble在.NET?

什么时候会有人使用其中一种?

.net floating-point double decimal

2015
推荐指数
15
解决办法
88万
查看次数

十进制vs双! - 我应该使用哪一个?何时使用?

我一直看到人们在C#中使用双打.我知道我读到某个地方,双打有时会失去精确度.我的问题是什么时候应该使用双倍,何时应该使用小数类型?哪种类型适合货币计算?(即超过1亿美元)

c# precision double currency decimal

851
推荐指数
7
解决办法
42万
查看次数

浮点数学在C#中是否一致?是真的吗?

不,这不是另一个"为什么是(1/3.0)*3!= 1"的问题.

我最近一直在读关于漂浮点的事情; 具体而言,相同的计算如何在不同的体系结构或优化设置上给出不同的结果.

对于存储重放的视频游戏来说,这是一个问题,或者是对等网络(而不是服务器 - 客户端),它依赖于每次运行程序时产生完全相同结果的所有客户端 - 一个小的差异浮点计算可能导致不同机器(甚至是同一台机器上)的游戏状态截然不同!

甚至在"跟随" IEEE-754的处理器中也会发生这种情况,这主要是因为某些处理器(即x86)使用双倍扩展精度.也就是说,它们使用80位寄存器进行所有计算,然后截断为64位或32位,导致与使用64位或32位进行计算的机器不同的舍​​入结果.

我在网上看到过这个问题的几种解决方案,但都是针对C++,而不是C#:

  • double使用_controlfp_s(Windows),_FPU_SETCW(Linux?)或fpsetprec(BSD)禁用双扩展精度模式(以便所有计算使用IEEE-754 64位).
  • 始终使用相同的优化设置运行相同的编译器,并要求所有用户具有相同的CPU架构(无跨平台播放).因为我的"编译器"实际上是JIT,它可能在每次运行程序时都有不同的优化,我认为这是不可能的.
  • 使用定点算术,避免floatdouble完全.decimal可以用于此目的,但会慢得多,并且没有任何System.Math库函数支持它.

那么,这在C#中是否也是一个问题? 如果我只打算支持Windows(而不是Mono)怎么办?

如果是,有没有办法强制我的程序以正常的双精度运行?

如果没有,是否有任何库可以帮助保持浮点计算的一致性?

.net c# floating-point precision ieee-754

152
推荐指数
6
解决办法
1万
查看次数

在C#中使用System.Decimal的数学运算?

需要能够在十进制数字上使用标准数学函数.准确性非常重要.double不是可接受的替代品.有没有图书馆允许这个?

编辑 我正在使用System.Decimal.我的问题是System.Math不起作用System.Decimal.

__PRE__

是否所有功能都不起作用 System.Decimal

c# math decimal

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

使用LINQ查找C#中数字数组的累积和

我有一个包含双精度的csv字符串(例如"0.3,0.4,0.3"),我希望能够输出一个包含这些数字累积和的双数组(例如[0.3,0.7,1.0]).

到目前为止,我有

double[] probabilities = textBox_f.Text.Split(new char[]{','}).Select(s => double.Parse(s)).ToArray();

它将数字作为数组给出,但不是数字的累积和.

有没有办法继续这个表达式来获得我想要的东西,还是我需要使用迭代从我已经拥有的数组创建一个新的数组?

c# linq arrays cumulative-sum

19
推荐指数
4
解决办法
2万
查看次数

在.net中,如何在Decimal和Double之间进行选择

我们前几天正在讨论这个问题,我希望有一个Stackoverflow问题,我会指点人们这样做.)

  • a Double和a有Decimal什么区别?
  • 何时(在什么情况下)你应该总是使用Double
  • 何时(在什么情况下)你应该总是使用Decimal
  • 什么是驱动因素的考虑在不属于上述两个阵营中的一个案例?

有很多问题与这个问题重叠,但他们倾向于询问某人在特定情况下应该做什么,而不是如何在一般情况下做出决定.

.net floating-point

18
推荐指数
2
解决办法
1089
查看次数

.NET上的双精度问题

我有一个简单的C#函数:

public static double Floor(double value, double step)
{
    return Math.Floor(value / step) * step;
}
Run Code Online (Sandbox Code Playgroud)

计算较高的数字,低于或等于"值",即"步数"的倍数.但它缺乏精确性,如下面的测试所示:

[TestMethod()]
public void FloorTest()
{
    int decimals = 6;
    double value = 5F;
    double step = 2F;
    double expected = 4F;
    double actual = Class.Floor(value, step);
    Assert.AreEqual(expected, actual);
    value = -11.5F;
    step = 1.1F;
    expected = -12.1F;
    actual = Class.Floor(value, step);
    Assert.AreEqual(Math.Round(expected, decimals),Math.Round(actual, decimals));
    Assert.AreEqual(expected, actual);
}
Run Code Online (Sandbox Code Playgroud)

第一个和第二个断言都可以,但是第三个断言失败,因为结果只等到第6个小数位.这是为什么?有没有办法纠正这个?

更新如果我调试测试我看到值相等,直到第8个小数位而不是第6个,可能是因为Math.Round引入了一些不精确.

注意在我的测试代码中,我写了"F"后缀(显式浮点常量),其中我的意思是"D"(双),所以如果我改变它,我可以有更多的精度.

.net c# math double

17
推荐指数
5
解决办法
4万
查看次数

浮点数,双精度和十进制最大值与大小

我在C#中遇到了这些数据类型的大小和最大值的混乱模式.

在使用Marshal.SizeOf()比较这些大小时,我发现以下结果 -

Float- 4 bytes,
Double - 8 bytes,
Decimal - 16 bytes
Run Code Online (Sandbox Code Playgroud)

当比较他们的MaxValues时,我得到了这样的结果,

 Float- 340282346638528986604286022844204804240,
 Double - 179769313486231680088648464220646842686668242844028646442228680066046004606080400844208228060084840044686866242482868202680268820402884062800406622428864666882406066422426822086680426404402040202424880224808280820888844286620802664406086660842040886824002682662666864246642840408646468824200860804260804068888,
 Decimal - 79228162514264337593543950335
Run Code Online (Sandbox Code Playgroud)

我感到困惑的原因是,Decimal比Float和Double需要更多的非托管内存,但是不能包含比浮动更大的值.任何人都可以解释编译器的这种行为.谢谢.

c# floating-point double types decimal

14
推荐指数
0
解决办法
4万
查看次数

将double转换为string时,如何将其舍入到C#中的N个小数位?

可能重复:
将小数点后的双精度数加到2位有效数字

我需要最多 N个小数,不多,但我不想尾随零.例如,如果N = 2则

15.352
15.355
15.3
15

应该(分别)

15.35
15.36
15.3
15

c# number-formatting

4
推荐指数
2
解决办法
8194
查看次数

在c#中将2个价格作为数据类型字符串进行比较

我想知道如何将2个价格作为数据类型字符串进行比较.

例;

string oldPrice = "£1.99";
string newPrice = "£2.50";
Run Code Online (Sandbox Code Playgroud)

我想比较newPrice是> = oldPrice但我不确定如何将字符串转换为decimal/int.脱掉£符号.

有任何想法吗?关于如何解决这个问题的提示或技巧?

c# type-conversion

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