在.NET3.5中从双精度中获取小数位数的精确精度

本文关键字:精度 获取 NET3 双精度 小数 | 更新日期: 2023-09-27 18:25:07

由于一项要求,我需要精确到小数点后4位的双精度值,如下所示:

double myDoubleValue = 50234.9489898997952932;

根据以上内容,我需要输出为50234.9489我不想在这个要求中四舍五入

我遇到了"数学.截断(a*100)/100;"。但实际上我对这种方法不感兴趣。

我正在寻找更好的方法,非常简单的方法,比如使用String.FormatRegular Expressions等。

在.NET3.5中从双精度中获取小数位数的精确精度

double d = 50234.94895345345345;
var Expected_result =  Double.Parse((Regex.Match(d.ToString(), "[+-]?''d*.''d{0,4}")).Value);

您需要自己完成这项工作。一个可能的解决方案是使用扩展方法

public static class DoubleEx
{
    public static double TruncateFraction(this double value, int fractionRound)
    {
        double factor = Math.Pow(10, fractionRound);
        return Math.Truncate(value * factor) / factor;
    }
}

这就是如何使用

double foo = 50234.9489898997952932;
double bar = foo.TruncateFraction(4);
Console.WriteLine(foo); //50234.9489898997952932
Console.WriteLine(bar); //50234.9489

没有正则表达式:

这适用于任何double组合

using System.Globalization;
class Program
{
    static void Main(string[] args)
    {
        double d = 50234.9489898997952932;
        char probablyDot = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator[0];
        string[] number = d.ToString().Split(probablyDot);

        //Console.WriteLine(number[0] + probablyDot + number[1].Remove(4));
        Console.WriteLine(number[0] + probablyDot + (number.Length >1 ? (number[1].Length>4? number[1].Substring(0,4):number[1]): "0000"));
        //Output: 50234.9489
        Console.ReadKey();
    }
}

这里有很多答案适用于问题中给出的输入,但在用一系列值测试它们时,它们都有局限性(请参阅注释)。

我能看到的用任何十进制输入实现这一点的唯一方法是以下。这可能不是一条直线,但对我来说似乎很稳健

private static string TrimDecimalPlaces(double value, int numberOfDecimalPlaces)
{
    string valueString = value.ToString();
    if (!valueString.Contains(".")) return valueString;
    int indexOfDot = valueString.IndexOf(".");
    if ((indexOfDot + numberOfDecimalPlaces + 1) < valueString.Length)
    {
        return valueString.Remove(indexOfDot + numberOfDecimalPlaces + 1);
    }
    return valueString;
}

我用以下测试数据进行了测试,结果如预期:

  • 1
  • 1.1
  • 1.11
  • 1.111
  • 1.1111
  • 1.11111
  • 1.111111
  • -1
  • -1.1
  • -1.11
  • -1.111
  • -1.1111
  • -1.11111
  • -1.111111