将 long double 转换为不带科学记数法的字符串 (Dart)
Convert long double to string without scientific notation (Dart)
我想在 Dart 中将一个 long double 转换为不带科学记数法的字符串,我认为只需执行 .toString() 就可以解决问题,但事实并非如此。
这是我的代码:
void main() {
double num = 0.00000000196620214137477;
String numToString = num.toString();
print(num);
print(numToString);
}
这是它打印的内容:
1.96620214137477e-9
1.96620214137477e-9
我想要数字的字符串表示形式,因为它是在定义时写入的。所以转换为字符串后我想要的打印输出是:
0.00000000196620214137477
提前致谢。
没有简单的方法可以直接使用 Dart 平台库来做你想做的事情,主要是因为在 JavaScript 中没有办法做到这一点。
您可以使用num.toStringAsFixed(20)
,但限制为20位,您的号码需要23位。
您可以做的一件事是直接操作字符串:
String toExact(double value) {
var sign = "";
if (value < 0) {
value = -value;
sign = "-";
}
var string = value.toString();
var e = string.lastIndexOf('e');
if (e < 0) return "$sign$string";
assert(string.indexOf('.') == 1);
var offset = int.parse(string.substring(e + (string.startsWith('-', e + 1) ? 1 : 2)));
var digits = string.substring(0, 1) + string.substring(2, e);
if (offset < 0) {
return "${sign}0.${"0" * ~offset}$digits";
}
if (offset > 0) {
if (offset >= digits.length) return sign + digits.padRight(offset + 1, "0");
return "$sign${digits.substring(0, offset + 1)}"
".${digits.substring(offset + 1)}";
}
return digits;
}
请注意,您不一定能获得所写 的值,因为并非所有双精度值都是准确的。在这种特殊情况下,你似乎很好。
还有另一种更简单的方法可以使用 decimal package. Recently came across 指向包裹的问题。
示例:
double originalNum = 0.00000000196620214137477;
Decimal convertedNum = Decimal.parse(originalNum.toString());
print('originalNum: $originalNum \n convertedNum: $convertedNum');
输出:
originalNum: 1.96620214137477e-9
convertedNum: 0.00000000196620214137477
我想在 Dart 中将一个 long double 转换为不带科学记数法的字符串,我认为只需执行 .toString() 就可以解决问题,但事实并非如此。
这是我的代码:
void main() {
double num = 0.00000000196620214137477;
String numToString = num.toString();
print(num);
print(numToString);
}
这是它打印的内容:
1.96620214137477e-9
1.96620214137477e-9
我想要数字的字符串表示形式,因为它是在定义时写入的。所以转换为字符串后我想要的打印输出是:
0.00000000196620214137477
提前致谢。
没有简单的方法可以直接使用 Dart 平台库来做你想做的事情,主要是因为在 JavaScript 中没有办法做到这一点。
您可以使用num.toStringAsFixed(20)
,但限制为20位,您的号码需要23位。
您可以做的一件事是直接操作字符串:
String toExact(double value) {
var sign = "";
if (value < 0) {
value = -value;
sign = "-";
}
var string = value.toString();
var e = string.lastIndexOf('e');
if (e < 0) return "$sign$string";
assert(string.indexOf('.') == 1);
var offset = int.parse(string.substring(e + (string.startsWith('-', e + 1) ? 1 : 2)));
var digits = string.substring(0, 1) + string.substring(2, e);
if (offset < 0) {
return "${sign}0.${"0" * ~offset}$digits";
}
if (offset > 0) {
if (offset >= digits.length) return sign + digits.padRight(offset + 1, "0");
return "$sign${digits.substring(0, offset + 1)}"
".${digits.substring(offset + 1)}";
}
return digits;
}
请注意,您不一定能获得所写 的值,因为并非所有双精度值都是准确的。在这种特殊情况下,你似乎很好。
还有另一种更简单的方法可以使用 decimal package. Recently came across
示例:
double originalNum = 0.00000000196620214137477;
Decimal convertedNum = Decimal.parse(originalNum.toString());
print('originalNum: $originalNum \n convertedNum: $convertedNum');
输出:
originalNum: 1.96620214137477e-9
convertedNum: 0.00000000196620214137477