c++ - 使用定点表示法将 double 转换为字符串,没有尾随零且没有 sprintf

标签 c++ string floating-point-conversion

此问题已被问过几次,但所有答案都涉及 sprintf 或涉及手动删除尾随零。真的没有更好的办法吗?用 std::stringstream 是不可能实现的吗?

最佳答案

首先计算小数点前后有多少个可能的数字:

int digits_before = 1 + (int)floor(log10(fabs(value)));
int digits_after = std::numeric_limits<double>::digits10 - digits_before;

然后你找出这些数字中有多少是零:

double whole = floor(pow(10, digits_after) * fabs(value) + 0.5);
while (digits_after > 0 && (whole/10.0 - floor(whole/10.0)) < 0.05)
{
    --digits_after;
    whole = floor(whole / 10.0 + 0.5);
}
if (digits_after < 0) digits_after = 0;

现在您有了一个可以与 std::setprecision 一起使用的值:

std::stringstream ss;
ss << std::fixed << std::setprecision(digits_after) << value;

归根结底,这是大量的工作并且重复了字符串转换所做的工作,这就是为什么人们通常只转换为字符串并删除尾随零的原因。不,没有简单的格式化选项可以执行此操作,您必须以困难的方式进行或根本不进行。

查看上面的代码:http://ideone.com/HAk55Y

关于c++ - 使用定点表示法将 double 转换为字符串,没有尾随零且没有 sprintf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22177656/

相关文章:

c++ - C 和 C++ 中的 1LL 或 2LL 是什么?

c++ - 这是生成 GUID 的可靠方法吗?

c++ - 无法接收/捕获 Windows 消息

java - 乘以浮点值 "possible lossy conversion from double to float"

c++ - 如何在两个 float 之间找到最短的十进制数

c# - 使用 VS2012 在 C# 上进行错误的 float 转换

c++ - WiFi 工作时,您可以使用所有 ESP32 的 GPIO 引脚吗?

string - 如何在特定单词后剪切字符串?

java - Java 标准输出中的克罗地亚语字符

c - 使用 sscanf 匹配零个或多个空格