为了账号安全,请及时绑定邮箱和手机立即绑定

浮动“平均”百分之一

浮动“平均”百分之一

C#
ABOUTYOU 2021-06-23 17:02:40
我在网上做这个问题: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/20.6)。

基数 2 难以表示十分之一。0.1最终被0b00110011重复,或类似的东西。

decimal在 C# 中以十为基数计算,而不是以二为基数。这使得它更准确,更划算,但它在某种程度上更慢


查看完整回答
反对 回复 2021-06-26
  • 1 回答
  • 0 关注
  • 175 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信