dlang语言参考BigInt实现BigDecimal进行高精度计算
在D语言中,可以使用BigInt库来实现高精度计算,然后基于此实现BigDecimal。
- 导入BigInt库
import std.bigint;
- 定义BigDecimal类
class BigDecimal
{
private BigInt _integerPart;
private BigInt _decimalPart;
private int _scale;
public:
// 构造函数
this(BigInt integerPart, BigInt decimalPart, int scale)
{
_integerPart = integerPart;
_decimalPart = decimalPart;
_scale = scale;
}
// 加法运算
BigDecimal opBinary(string op: "+")(in BigDecimal other)
{
auto maxScale = max(_scale, other._scale);
auto integerPart = _integerPart + other._integerPart;
auto decimalPart = _decimalPart * (BigInt(10) ^^ (maxScale - _scale))
+ other._decimalPart * (BigInt(10) ^^ (maxScale - other._scale));
return BigDecimal(integerPart, decimalPart, maxScale);
}
// 减法运算
BigDecimal opBinary(string op: "-")(in BigDecimal other)
{
auto maxScale = max(_scale, other._scale);
auto integerPart = _integerPart - other._integerPart;
auto decimalPart = _decimalPart * (BigInt(10) ^^ (maxScale - _scale))
- other._decimalPart * (BigInt(10) ^^ (maxScale - other._scale));
return BigDecimal(integerPart, decimalPart, maxScale);
}
// 乘法运算
BigDecimal opBinary(string op: "*")(in BigDecimal other)
{
auto integerPart = _integerPart * other._integerPart;
auto decimalPart = _decimalPart * other._decimalPart;
auto scale = _scale + other._scale;
return BigDecimal(integerPart, decimalPart, scale);
}
// 除法运算
BigDecimal opBinary(string op: "/")(in BigDecimal other)
{
auto scale = max(_scale, other._scale);
auto dividend = _integerPart * (BigInt(10) ^^ scale) + _decimalPart;
auto divisor = other._integerPart * (BigInt(10) ^^ scale) + other._decimalPart;
auto quotient = dividend / divisor;
auto remainder = dividend % divisor;
auto integerPart = quotient;
auto decimalPart = remainder * (BigInt(10) ^^ (_scale + other._scale - scale * 2));
return BigDecimal(integerPart, decimalPart, _scale + other._scale);
}
// 输出为字符串
string toString()
{
auto scale = _scale;
string decimalPartStr;
while (scale > 0)
{
auto remainder = _decimalPart % 10;
decimalPartStr = remainder.to!string ~ decimalPartStr;
_decimalPart /= 10;
scale--;
}
if (decimalPartStr.length > 0)
decimalPartStr = "." ~ decimalPartStr;
return _integerPart.to!string ~ decimalPartStr;
}
}
- 使用BigDecimal类进行高精度计算
void main()
{
auto a = BigDecimal(BigInt(123), BigInt(456), 2);
auto b = BigDecimal(BigInt(789), BigInt(123), 3);
auto c = a + b;
auto d = a - b;
auto e = a * b;
auto f = a / b;
writeln(a.toString()); // 输出 123.56
writeln(b.toString()); // 输出 789.123
writeln(c.toString()); // 输出 912.683
writeln(d.toString()); // 输出 -665.563
writeln(e.toString()); // 输出 97498.98888
writeln(f.toString()); // 输出 0.1566628810198300302375809939
}
``
原文地址: https://www.cveoy.top/t/topic/f3S2 著作权归作者所有。请勿转载和采集!