Tag: 精度

我疯了还是Math.Pow坏了?

我从这里使用了基本转换器并将其更改为使用ulong值,但是当转换大数字时,特别是高于16677181699666568的数字时,它返回的值不正确。 我开始研究这个并发现Math.Pow(3,34)返回值16677181699666568,而实际上3 ^ 34是16677181699666569.这因此为我投入了一个扳手。 我认为这只是Pow方法中双精度问题? 我最简单的解决方法就是创建我自己的Pow,它需要ulong值吗? 如果是这样,做Pow的最快方法是什么? 我假设每次都有一个比for循环更快的东西。

C#decimal,如何添加尾随零

我必须将尾随零添加到十进制值。 不仅用于显示(因此Format不是一个选项),而是在实际的底层数据中,因为小数精度在我们的应用程序中很重要。 我试过了: decimal value = 1M decimal withPrecision = value + 0.000M; 在许多情况下哪种方法效果很好……奇怪的是并非如此。 我调试了一个情况,其中withPrecision中的值仍然是1M,没有看到运行时的值和立即窗口中相同的硬编码值有任何差异。 我还使用decimal.GetBits来找到差异 – 没有。 我试过(这里提出调整小数精度,.net ): decimal value = 1M decimal withPrecision = value * 1.000M; 效果很好 – 除了案例值为零。 然后结果为0M,没有任何尾随零。 我也不相信解决方案,在其他情况下也可能不起作用。 目前我在: decimal value = 1M decimal withPrecision = (value * 1.000M) + 0.000M; 哪个适用于我目前发现的所有情况……但看起来也不值得信赖。 我也可以为零实现一个例外情况。 我认为Format和Parse会起作用。 我不喜欢它。 它看起来不是很快,我不明白为什么我必须将小数字放入一个字符串只是为了操纵它。 我开始相信这样一个简单的任务没有干净的解决方案。

如何在C#程序中获取小数到n位精度为Pi

注册到这个问题Pi in C# 我编写了下面的代码并给出了最后6位数为0的输出。所以我想通过将所有内容转换为十进制来改进程序。 我从来没有在C#中使用过十进制而不是之前的双倍,而我在常规使用中只能使用double。 所以请帮助我进行十进制转换,我试图在开始时将所有双倍替换为十进制并且它没有变好:(。 using System; class Program { static void Main() { Console.WriteLine(” Get PI from methods shown here”); double d = PI(); Console.WriteLine(“{0:N20}”, d); Console.WriteLine(” Get PI from the .NET Math class constant”); double d2 = Math.PI; Console.WriteLine(“{0:N20}”, d2); } static double PI() { // Returns PI return 2 * F(1); […]

浮动可以通过双倍往返而不会丢失精度吗?

如果我有一个C# float ,我可以将它转换为double而不会丢失任何精度吗? 如果该double转换回float ,它是否具有完全相同的值?

C#中的15位数的Double Type精度是不是?

我正在测试Brainteasers的代码: double d1 = 1.000001; double d2 = 0.000001; Console.WriteLine((d1 – d2) == 1.0); 结果是“假的”。 当我更改数据类型时: decimal d1 = 1.000001M; decimal d2 = 0.000001M; decimal d3 = d1-d2; Console.WriteLine(d3 == 1); 该程序写出正确的答案:“真”。 此问题仅在浮点后使用6位数。 15位数的精度怎么样?

Hashcode实现双精度

我之前已经问了一个关于这个课程的问题,但这里又是一个问题。 我创建了一个Complex类: public class Complex { public double Real { get; set; } public double Imaginary { get; set; } } 我正在实现Equals和Hashcode函数,而Equal函数考虑了一定的精度。 我使用以下逻辑: public override bool Equals(object obj) { //Some default null checkint etc here, the next code is all that matters. return Math.Abs(complex.Imaginary – Imaginary) <= 0.00001 && Math.Abs(complex.Real – Real) <= 0.00001; } […]

C#将对象转换为Decimal

我正在尝试将值为0.39999999999999997的对象转换为十进制变量而不会丢失精度。 object d = 0.39999999999999997; 我尝试了以下方法。 decimal val1 = Convert.ToDecimal(d); // val1 = 0.4 object val2 = Convert.ChangeType(d, Type.GetType(“System.Decimal”)); // val2 = 0.4 decimal val3 = decimal.Parse(d.ToString()); // val3 = 0.4 decimal val4 = (Decimal) d; // val4 = 0.4 我知道这不是十进制数据类型无法存储此值的问题,如下所示。 decimal val5 = 0.39999999999999997m; // val5 = 0.39999999999999997; 如何在不丢失精度的情况下将此对象转换为十进制? 如果重要的话,我正在使用.NET Framework 3.5。

划分双打时C#精度损失

我知道这已经一次又一次地讨论了,但我似乎无法得到一个一步一步的双重划分的最简单的例子,导致C#的预期的,不完整的结果 – 所以我想知道是否也许有一些编译器标志或其他奇怪的我没有想到的。 考虑这个例子: double v1 = 0.7; double v2 = 0.025; double result = v1 / v2; 当我在最后一行之后断开并在VS调试器中检查它时,“result”的值是27.999999999999996。 我知道我可以通过更改为“十进制”来解决它,但在周围程序的情况下这是不可能的。 像这样的两个低精度双倍不能分成28的正确值是不奇怪的? Math.Round的结果是唯一的解决方案吗?

MS图表中的自动间隔精度

我目前正在使用System.Windows.Forms.DataVisualization.Charting.Chart在.NET中使用图表。 到目前为止,它似乎非常强大,而且效果很好。 然而,就如何自动计算间隔而言存在巨大的问题。 我使用了很多double值,在像ZedGraph这样的库中,它完美地处理了这个问题。 它选择最小/最大/间隔就好了。 但是,在MS Chart中,它可以选择206.3334539832作为最小值,并选择相似小数精度的间隔。 显然这看起来很难看。 因此,我尝试简单地制作轴格式{0.00}并且在加载图表时效果很好。 除非你放大,你需要更高的精度,可能是4位小数而不是2位。看起来我要么一直处于9个小数位,要么是一个固定的常数,当有人需要更高的精度时它可能会破坏。 我宁愿根据当前应用的缩放级别来获取精度。 像ZedGraph和Dundas这样的图书馆(我相信MS甚至正在使用!)倾向于选择在放大和缩小时改变的好值。 当缩放框架改变时,有没有办法让间隔改变精度? 这可能是我设置错误的一些简单属性,但很难说这个东西有数百万个属性(特别是当大约有14个地方代表Interval的概念时)。

.NET中Timer的最大精度是多少?

我想知道Timer类的精度在System.Timers中是什么,因为它是一个double(这似乎表明你可以有几分之一毫秒)。 它是什么?