我有一个函数可以将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位数字,而小数分隔符就是。
答案 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);
}