Tag: 舍入

尝试计算框的分数时的十进制精度损失

我有一个场景,我有一个包含3jar的标准盒子。 出于显示和查询的目的,我必须根据其标准配置的十进制数量进行报告。 不可能说1盒3jar,1盒2jar……等等 例如,最初我将有1盒3jar 然后我删除1可以产生0.66重复的3jarjar 然后我再删除1 个jar子,产生0.33个重复的3个jar子 然后我删除最终可以导致0.0000000000000000000000000001盒3jar 当我删除最终的jar头时,我希望该值为0盒3jar,因为现在每个jar子都已从原始盒子中移除。 我很欣赏由于在处理有限数量的位时无法表示0.33重复这一事实而导致精度损失。 问题:对于那些需要使用舍入(可能是财务)的系统有更多经验的人,我有哪些选择来处理这个问题? 如何删除最后一个可能意味着该框不再存在? 编辑: 到底。 我使用了Loren Pechtel的建议并存储了jar头的数量,然后当我需要显示多少标准盒子时我将jar头总数除以标准盒子中的jar头数量仍然给出递归结果但这对报告来说很好事情的一面。 以下是一些代码,我希望这些代码可以帮助更多地概述问题: – static void Main(string[] args) { var box = new StandardBox(3); var boxDetail = new BoxDetail(1.0m, box); var allBoxes = new AllBoxes(); allBoxes.AddBox(boxDetail); allBoxes.RemoveItemFromBox(boxDetail, 1.0m); Console.WriteLine(allBoxes); allBoxes.RemoveItemFromBox(boxDetail, 1.0m); Console.WriteLine(allBoxes); allBoxes.RemoveItemFromBox(boxDetail, 1.0m); Console.WriteLine(allBoxes); Console.ReadLine(); } } public class StandardBox […]

带分钟的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’), […]

为什么c#不能计算数学函数的精确值

为什么c#不能做任何精确的操作。 Math.Pow(Math.Sqrt(2.0),2) == 2.0000000000000004 我知道双打是如何工作的,我知道舍入误差来自哪里,我知道它几乎是正确的值,而且我知道你不能在有限的双精度中存储无限数。 但是为什么没有一种方法可以让c#完全计算出来,而我的计算器可以做到。 编辑 这不是我的计算器,我只是举个例子: http://www.wolframalpha.com/input/?i=Sqrt%282.000000000000000000000000000000000000000000000000000000000000000000000000000000001%29%5E2 干杯

如何从十进制字符串中删除零和小数点?

以下代码目前输出: 12.1 12.100 12.1000 12.00 12 12.0000 如何更改它以便输出: 12.1 12.1 12.1 12 12 12 Math.Round似乎是事情,但它让我定义了我想要的小数位数,但我希望它们如上所述可变。 如果没有数学方法可以做到这一点,我只会从字符串的右侧去掉零和小数点,但会认为有一种数学方法来处理它。 using System; using System.Collections.Generic; namespace Test8834234 { public class Program { static void Main(string[] args) { List decimalsAsStrings = new List { “12.1”, “12.100”, “12.1000”, “12.00”, “12”, “12.0000” }; foreach (var decimalAsString in decimalsAsStrings) { decimal dec = decimal.Parse(decimalAsString); […]

C#如何在不进行舍入的情况下将双精度数组格式化为一位小数

我需要将double值格式化为一个小数位而不进行舍入。 double value = 3.984568438706 string result = “”; 我试过的是: 1) result = value.ToString(“##.##”, System.Globalization.CultureInfo.InvariantCulture) + “%”; // returns 3.98% 2) result = value.ToString(“##.#”, System.Globalization.CultureInfo.InvariantCulture) + “%”; // returns 4% 3) result = value.ToString(“##.0”, System.Globalization.CultureInfo.InvariantCulture) + “%”; // returns 4.0% 4)(以下其他建议) value = (value / 100); result = String.Format(“{0:P1}”, Math.Truncate(value * 10000) / 10000); // […]

获取最后2个没有舍入的小数位数

在C#中,我试图得到一个双精度的最后两位小数,没有四舍五入。 我已经尝试了从Math.Floor到Math.Truncate所有内容, Math.Floor没有任何工作。 我想要的结果样本: 1,424.2488298 -> 1,424.24 53.5821 -> 53.58 10,209.2991 -> 10,209.29 有任何想法吗?

C#Math.Round Up

我有一个问题。 我有一个小数,我想以2位小数舍入这个,而不是通常的方式 0.2013559322033898305084745763 期望的结果:0.21 我怎样才能做到这一点?

C# – (int)Math.Round((double)(3514 + 3515)/ 2)= 3514?

大家好。 int[] ai1=new int[2] { 3514,3515 }; void average1() { List aveList = new List { ai1[0],ai1[1]}; double AveragLI = aveList.Average(); int AverLI = (int)Math.Round((double)AveragLI); label1.Text = AverLI.ToString(); } 返回3514; 不应该是3515?

.NET 4中的Math.Round()行为

可能重复: 在C#中:Math.Round(2.5)的结果是2(而不是3)! 你在跟我开玩笑吗? .Net Round Bug 我有一个中间值(number.5),我需要指定如何舍入(上限值或下限值)。 我理解Math.Round与MidPointRounding参数的行为,但这并不能解决我的问题: // To Even Console.WriteLine(Math.Round(4.4)); // 4 Console.WriteLine(Math.Round(4.5)); // 4 Console.WriteLine(Math.Round(4.6)); // 5 Console.WriteLine(Math.Round(5.5)); // 6 // AwayFromZero Console.WriteLine(Math.Round(4.4)); // 4 Console.WriteLine(Math.Round(4.5)); // 5 Console.WriteLine(Math.Round(4.6)); // 5 Console.WriteLine(Math.Round(5.5)); // 6 // in one case I need Console.WriteLine(Math.Round(4.4)); // 4 Console.WriteLine(Math.Round(4.5)); // 4 Console.WriteLine(Math.Round(4.6)); // 5 Console.WriteLine(Math.Round(5.5)); // 5 […]

为什么我的号码被错误地舍入?

这感觉就像那种只在现场失败的代码,但我会尝试将其改编成代表我所看到的代码片段。 float f = myFloat * myConstInt; /* Where myFloat==13.45, and myConstInt==20 */ int i = (int)f; int i2 = (int)(myFloat * myConstInt); 单步执行代码后,i == 269,i2 == 268。 这里有什么可以解释这个差异?