获取双精度的小数?

时间:2014-01-31 21:03:07

标签: c#

我有一个函数可以将double添加到另一个double,但我只需要添加到小数点后面的数字,并且位数根据数字的大小而变化。

public double Calculate(double x, double add) 
{ 
    string xstr; 

    if (x >= 10) 
        xstr = x.ToString("00.0000", NumberFormatInfo.InvariantInfo); 
    if (x >= 100) 
        xstr = x.ToString("000.000", NumberFormatInfo.InvariantInfo); 
    if (x < 10) 
        xstr = x.ToString("0.00000", NumberFormatInfo.InvariantInfo); 

    string decimals = xstr.Remove(0, xstr.IndexOf(".") + 1); 
    decimals = (Convert.ToDouble(decimals) + add).ToString(); 
    xstr = xstr.Substring(0, xstr.IndexOf(".") + 1) + decimals; 
    x = Convert.ToDouble(xstr, NumberFormatInfo.InvariantInfo); 

    return x; 
} 

我想知道是否有更简单的方法来做到这一点,而不必先将数字转换为字符串然后再添加到它的小数部分。 正如您所看到的那样,要添加的数字应该始终是一个6位数字,而小数分隔符就是。

4 个答案:

答案 0 :(得分:8)

如果您将对象的剩余部分除以1,您将得到该数字的小数部分:

double remainder = someDouble % 1;

要编写整个方法,它就像:

一样简单
public double Calculate(double x, double add) 
{
    return Math.Floor(x) + (x + add) % 1;
}

(这是你很高兴%计算余数而不是模数的时间之一。这也适用于负数。)

答案 1 :(得分:1)

更优雅,更快捷:

public static double Calculate(double x, double add)
{
    var pow = 5 - Math.Truncate(Math.Log10(x));
    var multiplier = Math.Pow(10, pow);

    var decimals = Math.Truncate((x % 1)* multiplier) + add;
    x = Math.Truncate(x) + Math.Truncate(decimals) / multiplier;

    return x;
} 

答案 2 :(得分:0)

所以你想要做的就是添加每个值的小数部分?你为什么不这样做?

public double Calculate(double x, double y)
{
  double fractional_x =  x - Math.Floor(x);
  double fractional_y = y - Math.Floor(y);

  return fractional_x + fractional_y;
} 

答案 3 :(得分:0)

这是另一个版本:

public double Calculate(double x, double add) 
{
    return (x - (int)x) + (add - (int)add);
}