Live On Coliru
FormatFloat
我尝试用C++实现Golang strconv.FormatFloat()
的一个转换。
#include <sstream>
#include <iostream>
#include <string>
#include <iomanip>
using namespace std;
std::string convert_str(double d)
{
std::stringstream ss;
if (d >= 0.0001)
{
ss << std::fixed << std::setprecision(4); // I know the precision, so this is fine
ss << d;
return ss.str();
}
else
{
ss << std::scientific;
ss << d;
return ss.str();
}
}
int main()
{
std::cout << convert_str(0.002) << std::endl; // 0.0020
std::cout << convert_str(0.00001234560000) << std::endl; // 1.234560e-05
std::cout << convert_str(0.000012) << std::endl; // 1.200000e-05
return 0;
}
输出:
0.0020
1.234560e-05 // should be 1.23456e-05
1.200000e-05 // should be 1.2e-05
问题>如何设置输出修饰符,使尾随的零不显示?
strconv.FormatFloat(num,'e',-1,64)
特殊的精度值(-1)用于最小的位数,这样ParseFloat()将准确地返回f。
3条答案
按热度按时间a0zr77ik1#
冒着被严重否决的风险,因为发布了一个C回答了一个**C++**问题...你可以在对
sprintf
的调用中使用%lg
说明符。cpprefernce:
除非要求替代表示,否则将删除尾随零,如果没有小数部分,也将删除小数点字符。
因此,如果你只想在使用科学记数法时删除尾随的零,你可以将
convert_str
函数改为如下所示:对于代码中的三个测试用例,这将给予:
从C++20和更高版本开始,
std::format
class可能会提供一个更现代的替代方案;然而,我还没有完全“跟上”它,所以我不能使用它来给出一个解决方案。其他人可能想这样做。hc8w905p2#
可以使用
std::setprecision
和std::defaultfloat
操纵器的组合生成所需的输出:Live at:https://godbolt.org/z/67fWa1seo
rmbxnbpk3#
是的,std::scientific不会从科学记数法中删除尾随的零。对于您的特定情况,好消息是cout已经使用科学计数法格式化了0.0001以下的值,并删除了尾随的零。你可以让你的代码像这样: