在.NET3.5中从双精度中获取小数位数的精确精度
本文关键字:精度 获取 NET3 双精度 小数 | 更新日期: 2023-09-27 18:25:07
由于一项要求,我需要精确到小数点后4位的双精度值,如下所示:
double myDoubleValue = 50234.9489898997952932;
根据以上内容,我需要输出为50234.9489
我不想在这个要求中四舍五入
我遇到了"数学.截断(a*100)/100;"。但实际上我对这种方法不感兴趣。
我正在寻找更好的方法,非常简单的方法,比如使用String.Format
或Regular Expressions
等。
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