对于这个双精度值,四舍五入到特定位数的方法失败了
我正在尝试截断C#中的一系列双重精确值.无论我使用哪种舍入方法,以下值都会失败.这种值导致这两种方法失败的值有什么问题?为什么Math.Round甚至无法正确截断数字?可以使用哪种方法正确截断了此类值? 值: double value = 0.61740451388888251; 方法1: return Math.Round(value, digits); 方法2: double multiplier = Math.Pow(10, decimals) return Math.Round(value * multiplier) / multiplier; 即使在VS Watch Window中也失败! 解决方案 double是浮动二进制点类型.它们在二进制系统中表示(例如11010.00110).当十进制系统中添加双重时,只有一个近似值,因为并非所有二进制数在十进制系统中都具有准确的表示.例如,尝试此操作: double d = 3.65d
8 2024-04-25
编程技术问答社区
是否有相当于c++ fesetround()函数的C#函数?
我正在为间隔算术编写C#库,为此,我需要 将浮点操作舍入模式设置为上下.我知道在C ++中 可以通过FESETROUND()函数来实现它. c#中有等效的 或者如果没有,我该如何以其他方式实现? 解决方案 我遵循了帕斯卡·库克(Pascal Cuoq)的建议,并创建了一个非常简单的 - 一个功能组件. 如果其他人会遇到这样的问题,我将其发布在这里. 使用我的lib的解决方案: 下载dll文件从:/roundmodeutil.dll 添加对项目中图书馆的引用. 包括使用圆形摩擦器;项目代码中的行. 用法: static void RoundModeConfig::setround( int mode ); // mode can be set to one of the following values: static int RoundModeConfig::UPWARD static int RoundModeConfig::DOWNWARD s
16 2024-04-23
编程技术问答社区
Math.Round()似乎不一致
可能的重复: .net圆形错误 in C# :Math.Round(2.5)结果为2(而不是3)!你在开玩笑吗? 代码: var d1 = Math.Round(187.5); // 188 var d2 = Math.Round(62.5); // 62 为什么这样? 解决方案 默认情况下,Math.Round使用一种称为 banker的圆形圆形圆形,当输入位于两个整数之间的一半时,它可以圆形到最近的偶数整数. 请参阅为什么.net .net将银行家的舍入为默认值?以了解此设计决定. 如果您不喜欢这种行为,则可以随时使用其他解决方案 您可以通过调用该方法的过载来改变此行为 - http://msdn.microsoft.com/en-us/library/ms131274.aspx
10 2024-04-23
编程技术问答社区
带分钟的DATEDIFF没有返回预期值
说,我有以下SQL Server 2008表,其中包含数据: CREATE TABLE tbl (dtIn DATETIME2, dtOut DATETIME2) INSERT tbl VALUES ('9/10/2012 5:14:10 AM', '9/10/2012 5:15:09 AM'), ('9/10/2012 5:16:12 AM', '9/10/2012 5:18:12 AM'), ('9/10/2012 5:18:43 AM', '9/10/2012 5:23:04 AM'), ('9/10/2012 5:25:17 AM', '9/10/2012 5:26:05 AM'), ('9/10/2012 5:26:57 AM', '9/10/2012 5:29:19 AM'), ('9/10/2012 5:31:41 AM', '9/10/2012 5:32:41 AM'), ('9/10/2012 5:33:16 AM', '9/10/2012 5:34:08 AM'
10 2024-04-22
编程技术问答社区
被四舍五入咬住了?
为什么以下代码: Console.WriteLine(String.Format("{0:C0}", 2170/ 20)); 在做 时产生" $ 109" Console.WriteLine(Math.Round(2170 / 20)); 给我108? 如何获得2170/20给我109? 解决方案 当您划分为积分类型的值时,例如2170和20时,运行时执行整数划分和丢弃(截断). 如果将操作数之一更改为float,double或decimal(例如,2170.0 / 20或2170 / 20m),它将执行浮点部门. 因此,您需要将其更改为 Console.WriteLine(Math.Round(2170.0 / 20)); 编辑 这样: Math.Round(2170m / 20, MidpointRounding.AwayFromZero) 其他解决方案 尝试Math.Round(2170.0/20.0)
10 2024-04-22
编程技术问答社区
当试图计算一个盒子的分数时,小数点精度损失
我有一个场景,其中有一个包含3罐的标准盒.为了显示和查询目的,我必须根据其标准配置的十进制数量进行报告.不可能说1个盒子的3罐,1盒2罐...等等> 例如,最初我将拥有3个罐子 的 1盒 然后,我删除1罐,以 0.66的3罐重复盒 然后,我删除1个罐,导致 0.33重复出现的3罐 然后,我删除最终罐,导致 0.0000000000000000000000000001 3罐的盒子 当我删除决赛时,我希望该值为 0的3罐的盒子,因为现在每个罐子都从原始框中删除.我感谢由于无法在处理有限数量的位时反复出现的0.33反复出现的事实,因此丧失了精确度. 问题:对于那些在需要使用四舍五入(财务)的系统方面拥有更多经验的人,我可以选择解决这个问题?您将如何去删除最后一个可能意味着盒子不再存在? 编辑: 到底.我使用了Loren Pechtel的建议并存储了罐子的数量,然后当我需要显示多少标准盒我将罐总数除以标准盒中的罐子数量,这仍然给出递归结果,但这对报告很好事物的一面
8 2024-04-22
编程技术问答社区
是否有办法根据数值是超过0.5还是低于0.5来确定底线/上限?
我正在尝试围绕我的值绕,以便如果它是0.5或更大的,它将变成1,否则它会变成0.例如: 3.7 -> 4; 1.3 -> 1; 2.5 -> 3; ... 有什么想法? 解决方案 Math.Round(3.7,MidpointRounding.AwayFromZero); http://msdn.microsoft library/system.midpointrounding.aspx 在上面,我使用AwayFromZero进行舍入,因为默认值是银行家的舍入,因此,如果分数为0.5,则将其舍入到最接近.因此,3.5变为4(最近),但是2.5变为2(最近).因此,您选择一种不同的方法,如上所述,使3.5至4和2.5至3. 其他解决方案 最简单的方法是将0.5添加到输入中,然后施放到int. 其他解决方案 我最后一次到达,所以我会说出不同的东西.您通过不使用double将0.5绕1!使用decimal s. double拥有"精确"数字不好.
10 2024-04-21
编程技术问答社区
.NET。小数点到四舍五入的字符串
如果我有一个decimal,我如何获得两个小数点的字符串版本?这不起作用: Math.Round(myDecimal, 2).ToString("{0.00}"); 解决方案 不要使用卷曲括号,它们用于使用string.Format的较长字符串中嵌入格式的值.使用此: myDecimal.ToString("0.00"); 其他解决方案 也许我错了,但是我已经尝试了myDecimal.ToString(); 其他解决方案 假设myDecimal是System.Decimal,然后Math.Round(myDecimal, 2).ToString();将显示两个精度的小数点数字,如您所需的,没有任何格式(除非您的数字的绝对值大于10^^ 27-1).这是因为decimal数据类型保留了数字的完整精度.也就是说,1m,1.0m和1.00m的存储方式都不同,并且显示出不同的显示. 请注意,float或double的情况并非如此. 1f,1.0f和1.00f
10 2024-04-21
编程技术问答社区
滞后圆,以解决由于噪音引起的 "闪烁 "值问题
背景: 我们有一个嵌入式系统,该系统使用10位类似物的数字转换器将线性位置(0 mm -40 mm)从电位计电压转换为数字值. ------------------------ 0mm | | 40 mm ------------------------ 我们以1 mm增量向用户显示线性位置.前任. 1mm,2mm,3mm等 问题: 我们的系统可用于电磁嘈杂的环境,这可能会导致线性位置因进入ADC的噪声而"闪烁".例如,我们将看到以下值:39,40,39,40,39,38,40等.当电位计为39毫米时. 由于我们要舍入到每1毫米,因此,如果值在1.4到1.6 mm之间,我们将看到1至2之间的闪烁. . 建议的软件解决方案: 假设我们无法更改硬件,我想在值的四舍五入添加一些磁滞,以避免这种闪烁.这样: 如果该值当前为1mm,则只能达到2mm,如果原始值为1.8或更高. 同样,如果当前值为1mm,则
10 2024-04-21
编程技术问答社区
double.Parse在某些国家显然不能工作。
基本上,我有这个非常简单的计算: int bTaxPrice = int.Parse(prices[wep]); double t = double.Parse("1." + taxes); double price = Math.Round(t * bTaxPrice); 我将举一个示例,说明计算应该如何工作,可以说t=1.1和bTaxPrice=1279,然后1.1*1279 = 1406.9,但是由于我要舍入结果,因此价格等于1407. 对于使用我的C#Winforms程序的其他国家(丹麦)的某些用户来说,正在遇到一个问题,导致数字不圆,而是在小数点之后添加最后2位数字. 我们的计算结果为1407,对他们来说是140690. 我在互联网上阅读了有关它的信息,有些国家有一些特别的小数点. 这类问题有什么好解决方案? 解决方案 实际上,许多国家使用逗号作为小数分离器. 如果要使用点作为分离器,请使用不变CultureInfo: doubl
6 2024-04-21
编程技术问答社区
除法时的小数点舍入错误(C#)。
我基本上有四个数字(例如100、200、300、400),我需要将概率计算为100/(100+200+300+400),200/(100+200+200+300+300+400) ,等等. 当我使用十进制数据类型存储这些概率时,由于圆形问题,它们的最大值不会达到.在不提出概率的情况下,最好的方法是什么?基本上,我要多次进行此计算,因此我不想将所有分隔更改为数学. :| 解决方案 解决方案很简单:如果您这样做会受伤,那就不要这样做. 如果您有 Rational 概率,即,概率是整数的比率,并且您希望它们恰好添加到一个,则 不要将它们转换为十进制或双倍首先.使用任意过度的合理类型来表示您的任意精度合理. Microsoft Solver Foundation中包含了任意推荐的合理类型;您可以下载并使用它.或者,只需简单地制作一个不变的结构,它就可以编写自己的分子和分母,然后编写所需运算符的实现,这很容易编写自己的内容. 其他解决方案 没有电话数量可以按照您想
16 2024-04-20
编程技术问答社区
在c#中四舍五入到最近的10's位
我想将数字四舍五入到最近的10的位置. 例如,像17.3之类的数字被四舍五入为20.0.并希望允许三个重要的数字.作为该过程的最后一步的三分之一的含义. 样本: the number is 17.3 ,i want round to 20 , and this number is 13.3 , i want round to 10 ? 我该怎么做? 解决方案 Chris Charabaruk为您提供了所需的答案在这里 要进入核心,这是他作为扩展方法的解决方案: public static class ExtensionMethods { public static int RoundOff (this int i) { return ((int)Math.Round(i / 10.0)) * 10; } } int roundedNumber = 236.RoundOff(); // retu
8 2024-04-20
编程技术问答社区
在MonoGame(XNA)中绘制贝塞尔曲线会产生划痕的线条
我最近开始使用一单亲,我喜欢图书馆. 但是,我似乎在绘制Bezzier Curves 时遇到了一些问题 我的代码产生的结果看起来像 看起来很糟糕,不是吗? 这些线根本不光滑. 让我向您展示一些代码: //This is what I call to get all points between which to draw. public static List computeCurvePoints(int steps) { List curvePoints = new List(); for (float x = 0; x
10 2024-04-20
编程技术问答社区
在C#中进行多倍加法时,为什么顺序会影响四舍五入?
考虑以下C#代码: double result1 = 1.0 + 1.1 + 1.2; double result2 = 1.2 + 1.0 + 1.1; if (result1 == result2) { ... } 结果1应该始终等于结果2对吗?事实是,事实并非如此.结果1为3.3,结果2为3.30000000000003.唯一的区别是常数的顺序. 我知道双打的实施方式可能会发生四舍五入.我知道,如果需要绝对的精度,我可以使用小数.或者我可以在我的if语句中使用Math.Round().我只是一个想了解C#编译器在做什么的书呆子.谁能告诉我? 编辑: 感谢迄今为止建议阅读浮点算术和/或谈论CPU如何处理双打的固有不准确性的所有人.但是我觉得我问题的主要目的仍然没有得到答复.这是我不正确措辞的错.让我这样说: 分解上述代码,我希望以下操作发生: double r1 = 1.1 + 1.2; double r2 = 1.0 + r1 do
12 2024-04-19
编程技术问答社区
在小数的四舍五入扩展中出错--不能用实例引用来访问;用类型名来限定它。
我已经多次使用了扩展方法,但没有遇到这个问题.有人有任何想法,为什么要丢失错误? /// /// Rounds the specified value. /// /// The value. /// The decimals. /// public static decimal Round (this decimal value, int decimals) { return Math.Round(value, decimals); } 用法: decimal newAmount = decimal.Parse("3.33333333333434343434"); this.rtbAmount.Text = newAmount.Round(3).T
14 2024-04-19
编程技术问答社区
C#银行家的四舍五入错误
double a = 18.565 return Math.Round(a,2) ..返回18.57. 对于我尝试的所有其他数字,我尝试的银行家舍入的工作正常,例如Math.Round(2.565,2)返回2.56. 有任何线索为什么以及何时发生? 这是错误还是我错过了银行家的四舍五入? 谢谢.. 正如马修所说, 解决方案 无法准确代表18.565.所使用的实际值为18.56500000000012789769243681818034568023681640625(使用当然,即使是圆形值也不是18.57.实际上是18.5700000000000000028421709430404007434444970703125. 从根本上讲,如果您真的非常关心准确表示十进制值,则应使用decimal.这不仅在Math.Round方面 - 都进入处理浮点值的各个方面. 做给出适合Math.Round的正确值,当然: decimal m = 18.565m; C
14 2024-04-19
编程技术问答社区
为什么C#四舍五入和SQL四舍五入函数会产生不同的输出?
我正在使用ROUND C#和SQL的函数,令人惊讶的是都产生了不同的结果. 在sql中:ROUND(1250.00, -2) = 1300 在C#ROUND 1250中,带有圆形和precision = 2 = 1200 以前有人遇到过这种情况吗? 解决方案 c#默认使用银行家的舍入,当您恰好在.5分数上时,它会圆形到最接近的偶数数字,而不是总是围绕. MSDN 文章描述了这种行为.基本上,当您将很多圆形数字累积时,它是减少四舍五入错误. 其他解决方案 如果您阅读 http://msdn.microsoft.com/en-us/library/wyk4d9cy.aspx ,您会发现默认的舍入为"圆形到偶数"(银行家的圆形),其中SQL Server为SQL Server 似乎正在使用"标准"舍入 更新SQL Server进行对称算术舍入或对称圆形(修复)(修复),具体取决于参数 如何解决问题:实施自定义舍入步骤: http://supp
12 2024-04-18
编程技术问答社区
为什么c#不能计算出数学函数的精确值?
为什么C#不能执行任何确切的操作. Math.Pow(Math.Sqrt(2.0),2) == 2.0000000000000004 我知道双打的工作方式,我知道四舍五入错误来自哪里,我知道它几乎是正确的值,而且我知道您不能以有限的双重数字存储无限的数字.但是,为什么没有一种方法可以准确地计算出来,而我的计算器可以做到. 编辑 这与我的计算器无关,我只是举个例子: http://www.wolframalpha.com/input/? I = SQRT%282.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001%%29%5E2 欢呼 解决方案 的机会是您的计算器不能准确地做到这一点 - 但是它可能会存储更多的信息,因此,平方后的错误最终出现在显示的内容的边界之外.要么在这种情况下,要么
16 2024-04-18
编程技术问答社区
获取小数点后2位,无需四舍五入
在C#中,我正在尝试获得双倍的最后两个小数点,而没有圆形.我尝试了从Math.Floor到Math.Truncate的所有内容,但没有任何工作. 我想要的结果样本: 1,424.2488298 -> 1,424.24 53.5821 -> 53.58 10,209.2991 -> 10,209.29 有什么想法? 解决方案 好吧,数学上很简单: var f = 1.1234; f = Math.Truncate(f * 100) / 100; // f == 1.12 将小数点移到右侧的两个位置,铸造到截断,将其移回左两个位置.框架中可能有一些方法可以做到这一点,但是我现在看不到.您可以概括它: double Truncate(double value, int places) { // not sure if you care to handle negative numbers... var f = Math.P
24 2024-04-18
编程技术问答社区
在C#中四舍五入到偶数
我看不到我期望的数学. return Math.Round(99.96535789, 2, MidpointRounding.ToEven); // returning 99.97 我了解中间曲目.不是这样吗? 我什至尝试过,但也返回了99.97: return Math.Round(99.96535789 * 100, MidpointRounding.ToEven)/100; 我缺少什么 谢谢! 解决方案 您实际上并不是中点. MidpointRounding.ToEven表示,如果您有数字 99.965 ,即99.96500000 [etc.],然后 ,您将获得99.96.由于您传递到数学的数字.圆形高于此中点,因此正在汇总. 如果您希望您的电话号码下降到99.96,请执行此操作: // this will round 99.965 down to 99.96 return Math.Round(Math.Truncate(99.
8 2024-04-18
编程技术问答社区