我在网上做这个问题:https : //www.codewars.com/kata/getting-along-with-integer-partitions/train/csharp/5af1b2b768e64499ed000102它的基本思想是我应该找到一个数字的所有部分并显示范围、平均值和中位数。该程序可以很好地处理大多数数字,但是当面对一些数字时,平均值并不准确。这些是我遇到问题的一些数字:43 -- 预期:平均:202904.6 5 但是是:202904.6 036 -- 预期:平均:26832.8 1 但是是:平均:26832.8 041 -- 预期:平均:113720.8 2 但是是:平均:113720.8 0这是因为我使用浮点数来存储我的数字吗?如果是这样,我应该使用什么数据类型?这是我的代码(您可以将其直接粘贴到我链接的网站上,它会给您带来与我相同的错误)using System;using System.Collections.Generic;using System.Collections.Specialized;using System.Linq;public class IntPart{ public static List<List<string>> listOfLists = new List<List<string>>(); public static List<string> lastPartion = new List<string>(); //get the last partion public static string Part(long n) { Console.WriteLine(n); lastPartion.Clear(); listOfLists.Clear(); List<List<long>> result = new List<List<long>>(); partition((int)n); //gets rid of blip where there's an extra space at the start of the string and foreach (var cycle in lastPartion) listOfLists.Add(cycle.Split(' ').ToList()); //converts the cycles to a list and converts string list to double for (int i = 0; i < listOfLists.Count; i++) { listOfLists[i].RemoveAt(0); result.Add(listOfLists[i].Select(x => long.Parse(x)).ToList()); } return removeAndSort(result); } //partioning algorithom with recursion public static void partition(int n) { partition(n, n, ""); } public static void partition(int n, int max, string prefix) { if (n == 0) { lastPartion.Add(prefix); return; } for (int i = Math.Min(max, n); i >= 1; i--) partition(n - i, i, prefix + " " + i); }
1 回答
达令说
TA贡献1821条经验 获得超6个赞
此错误是由float
计算值的方式引起的。它们是以 2 为基数计算的,而不是以 10 为基数计算的。当切换不同的基数时,有些数字无法用十进制形式表示。
众所周知,1/3
不能写为以 10 为基数的小数,但以 121/3
为基数,是0.4
(并且1/2
是0.6
)。
基数 2 难以表示十分之一。0.1
最终被0b00110011
重复,或类似的东西。
decimal
在 C# 中以十为基数计算,而不是以二为基数。这使得它更准确,更划算,但它在某种程度上更慢
- 1 回答
- 0 关注
- 175 浏览
添加回答
举报
0/150
提交
取消