浮动“平均”百分之一

我在网上做这个问题:https : //www.codewars.com/kata/getting-along-with-integer-partitions/train/csharp/5af1b2b768e64499ed000102

它的基本思想是我应该找到一个数字的所有部分并显示范围、平均值和中位数。该程序可以很好地处理大多数数字,但是当面对一些数字时,平均值并不准确。

这些是我遇到问题的一些数字:

  • 43 -- 预期:平均:202904.6 5 但是是:202904.6 0

  • 36 -- 预期:平均:26832.8 1 但是是:平均:26832.8 0

  • 41 -- 预期:平均: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);

    }


ABOUTYOU
浏览 181回答 1
1回答

达令说

此错误是由float计算值的方式引起的。它们是以 2 为基数计算的,而不是以 10 为基数计算的。当切换不同的基数时,有些数字无法用十进制形式表示。众所周知,1/3不能写为以 10 为基数的小数,但以 121/3为基数,是0.4(并且1/2是0.6)。基数 2 难以表示十分之一。0.1最终被0b00110011重复,或类似的东西。decimal在 C# 中以十为基数计算,而不是以二为基数。这使得它更准确,更划算,但它在某种程度上更慢
打开App,查看更多内容
随时随地看视频慕课网APP