截断C#中double值的位数

时间:2009-09-15 12:23:22

标签: c#

如何在C#中截断double值的前导数字,我已经尝试了Math.Round(doublevalue,2)但没有给出require结果。我没有在Math类中找到任何其他方法。

例如我的值为12.123456789,我只需要12.12。

12 个答案:

答案 0 :(得分:27)

编辑:已经指出这些方法围绕值而不是截断。很难真正截断double值,因为它实际上不在正确的基础上......但截断decimal值更为可行。

您应该使用适当的格式字符串,customstandard,例如

string x = d.ToString("0.00");

string x = d.ToString("F2");

值得注意的是,double值本身并不“知道”它有多少小数位。只有当你将它转换为字符串时才真正有意义。使用Math.Round将获得与x.xx00000最接近的double值(如果您看到我的意思)但由于二进制浮点类型的方式,它几乎肯定不会是精确值x.xx00000工作

如果您需要其他而不是字符串格式,则应考虑使用decimal。该值实际代表什么?

我在.NET中有binary floating pointdecimal floating point的文章,您可能会发现这些文章很有用。

答案 1 :(得分:20)

你有什么尝试?它对我有用:

double original = 12.123456789;

double truncated = Math.Truncate(original * 100) / 100;

Console.WriteLine(truncated);    // displays 12.12

答案 2 :(得分:3)

此代码......

double x = 12.123456789;
Console.WriteLine(x);
x = Math.Round(x, 2);
Console.WriteLine(x);

返回此....

12.123456789
12.12

你想要的结果有什么不同?

如果你想把这个值保持为一个双倍,并且只是在第二个小数位后面的任何数字上剥离而不是实际围绕数字,那么你可以简单地从你的数字中减去0.005,这样那个回合就可以了。例如。

double x = 98.7654321;
Console.WriteLine(x);
double y = Math.Round(x - 0.005, 2);
Console.WriteLine(y);

制作此...

98.7654321
98.76

答案 3 :(得分:3)

double original = 12.123456789;  

double truncated = Truncate(original, 2);  

Console.WriteLine(truncated.ToString());
// or 
// Console.WriteLine(truncated.ToString("0.00"));
// or 
// Console.WriteLine(Truncate(original, 2).ToString("0.00"));


public static double Truncate(double value, int precision)
{
    return Math.Truncate(value * Math.Pow(10, precision)) / Math.Pow(10, precision);
}

答案 4 :(得分:2)

我确信那里有更多东西。但为什么不呢: -

double truncVal = Math.Truncate(val * 100) / 100;
double remainder = val-truncVal;

答案 5 :(得分:2)

怎么样:

double num = 12.12890;
double truncatedNum = ((int)(num * 100))/100.00;

答案 6 :(得分:2)

这可行(虽然未经测试):

public double RoundDown(this double value, int digits)
{
     int factor = Math.Pow(10,digits);

     return Math.Truncate(value * factor) / factor;
}

然后你只需使用它:

double rounded = number.RoundDown(2);

答案 7 :(得分:0)

对象编号= 12.123345534;
的String.Format({ “0:00”},number.ToString());

答案 8 :(得分:0)

如果您希望在小数点后面有两个点而不对数字进行舍入,则以下内容应该可以正常工作

string doubleString = doublevalue.ToString("0.0000"); //To ensure we have a sufficiently lengthed string to avoid index issues
Console.Writeline(doubleString
             .Substring(0, (doubleString.IndexOf(".") +1) +2)); 

substring的第二个参数是count,而IndexOf返回从零开始的索引,所以在添加2个十进制值之前我们必须先添加一个。

这个答案是假设值不应该舍入

答案 9 :(得分:0)

对于vb.net,请使用此扩展程序:

Imports System.Runtime.CompilerServices

Module DoubleExtensions

    <Extension()>
    Public Function Truncate(dValue As Double, digits As Integer)

        Dim factor As Integer
        factor = Math.Pow(10, digits)

        Return Math.Truncate(dValue * factor) / factor

    End Function
End Module

答案 10 :(得分:0)

这可能是十进制?我写了自己的《在网上寻找答案的努力》。该代码可能不是完全验证的,因为我缺乏完全验证的经验。最终将把这种方法重建为简单而又出色的方法,从而以更少的步骤完成工作,同时整体鲁棒性也得到改善。您可以轻松地将其转换为间距计数的输入。但我不能保证它将与2 dec以外的其他功能一起正常工作。我不喜欢简单的输入。似乎要处理几笔0.000.000,因为我正在处理权重为0000.000的重量。此外,在计算后将价格四舍五入。

exports.handler = async (event) => {
  ///some other stuff to set up the variables below
  let results = [];
  var docClient = new AWS
    .DynamoDB
    .DocumentClient({ convertEmptyValues: true, endpoint: "dynamodb.us-west-1.amazonaws.com" });
  try {
    for (let i = 0; i < event.Records.length; i++) {
      var db_params = {
        TableName: entity,
        Key: entityKey,
        "UpdateExpression": update_expression,
        "ExpressionAttributeNames": expression_attribute_names,
        "ExpressionAttributeValues": expression_attribute_values,
        "ReturnValues": "ALL_NEW"
      };
      console.log('executing updateObjectPromise');
      let item = await docClient
        .update(db_params)
        .promise();
      console.log(entity + " inserted");
      console.log(item);
      results.push(item);
    }
  } catch (error) {
    console.log("ERROR: ");
    console.log(error);
    throw error;
  }
  return results; // return and finish lambda function
};

答案 11 :(得分:0)

使用Math.Truncate(double)有很多答案。 但是,使用Math.Truncate(double)的方法可能导致错误的结果。 例如,它将返回5.01截断5.02,因为双精度值的乘积无法精确工作,并且5.02 * 100 = 501.99999999999994

5.02*100=501.99999999999994

如果您确实需要这种精度,请考虑在截断之前转换为十进制。

public static double Truncate(double value, int precision)
{
    decimal power = (decimal)Math.Pow(10, precision);
    return (double)(Math.Truncate((decimal)value * power) / power);
}

不过,这种方法要慢10倍左右。