作为 How can I convert a float to string? 的变体,我正在寻找一种简单的方法来获取既简洁又无损的 float 的字符串表示形式。例如:
let a = 1.0;
let b = 1.1234567890123456789012345678901e50;
let c = 1.1234567890123456789012345678901e-50;
for x in &[a, b, c] {
println!("{}", x);
println!("{:?}", x);
println!("{}", x.to_string());
println!("{}", f64::to_string(&x));
println!("{:e}", x);
}
这会产生:
1
1.0
1
1
1e0
112345678901234570000000000000000000000000000000000
112345678901234570000000000000000000000000000000000.0
112345678901234570000000000000000000000000000000000
112345678901234570000000000000000000000000000000000
1.1234567890123457e50
0.000000000000000000000000000000000000000000000000011234567890123456
0.000000000000000000000000000000000000000000000000011234567890123456
0.000000000000000000000000000000000000000000000000011234567890123456
0.000000000000000000000000000000000000000000000000011234567890123456
1.1234567890123456e-50
换句话说:
{}
、{:?}
、x.to_string()
和f64::to_string(&x)
都产生许多前导/尾随零。{:e}
有助于打印b
和c
,但它对所有数字强制使用指数表示法,这会导致不寻常的表示像1e0
。
有没有办法生成一个无损的字符串,并且只在适当的时候自动使用指数表示法?
这样的转换可以扩展到所有数字类型吗?
明确目标。我基本上想要字符串化 float 在其他编程语言中的工作方式相同,这些编程语言巧妙地从定点符号变为指数符号以产生精确的、人类可读的表示。例如在 JVM 上:
scala> (1.1234567890123456789012345678901e50).toString()
res1: String = 1.1234567890123457E50
scala> (1.0).toString()
res2: String = 1.0
scala> (1.1234567890123456789012345678901e-50).toString()
res3: String = 1.1234567890123456E-50
最佳答案
这里的要求有点模糊。您可能想尝试 ryu
crate 看看它是否符合您的需求:
use ryu; // ryu = "1.0"
fn main() {
let mut buffer = ryu::Buffer::new();
let a = 1.0;
let b = 1.1234567890123456789012345678901e50;
let c = 1.1234567890123456789012345678901e-50;
for &x in [a, b, c].iter() {
println!("{}", buffer.format(x));
}
}
它产生输出:
1.0
1.1234567890123457e50
1.1234567890123456e-50
关于string - 如何在 Rust 中获得 float 的紧凑但无损的字符串表示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59794031/