- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我必须使用非科学(即无尾数/指数/E)字符串转换十进制数。我的代码如下所示:
/*!
\brief Converts a <em>XML Schema Decimal</em>
*/
char *ToDecimal(double val) const
{
const size_t nMax = 200;
char *doubleStr = new char[nMax];
sprintf(doubleStr, "%1.6f", val);
return doubleStr;
}
问题是,当输入 val
为 1
时,函数返回 1.000000
但我希望得到 的输出1
。另外,如果我将代码更改为 sprintf(doubleStr, "%1.0f", val);
那么它会正确输出 1
,但是如果输入 val
更改为 0.000005
输出为 0
,我希望输出为 0.000005
。所以基本上我希望所有输出尽可能短,并删除所有不必要的 0
。这可以用 sprintf
实现吗?我想通过此功能支持 3.4E +/- 38 范围。
最佳答案
事实证明,c++ iostream(具体来说,ostringstream
)比 sprintf
更适合您的任务。
使用 std::fixed
操纵器禁用科学记数法。使用 std::setprecision
指定精度(小数点后的字符数)。在您的情况下,45 个位置的精度似乎足以表示所有 float
数字。
#include <sstream>
#include <string>
#include <iostream>
#include <iomanip>
std::string convert(double x)
{
std::ostringstream buffer;
buffer << std::fixed << std::setprecision(45) << x;
std::string result = buffer.str();
return result;
}
此外,要清理结果,请删除所有尾随零。
size_t i = result.find_last_not_of('0');
if (result[i] != '.')
++i;
result.erase(i);
注意:清除尾随零仅适用于可精确表示的数字(如 0.75 或 0.03125):例如,数字 0.1 转换为 0.10000000000000000555111512312578270211815834
。可以使用非常数精度(取决于数字的大小),但要做到这一点非常棘手。
相反,可以使用以下丑陋(且缓慢)的 hack:尝试将字符串的开头转换回 double
,如果结果等于初始数字,则剪切字符串。
size_t i;
for (i = 1; i < result.size(); ++i)
{
std::istringstream cut(result.substr(0, i));
double temp;
cut >> temp; // the verbose syntax could fit into one line
if (temp == x) // by using boost::lexical_cast
break;
}
关于c++ - sprintf 小数点太多/太少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15603003/
我正在尝试将之前使用 serial->write... 函数从 GUI 读取的 7 个变量发送到我的微 Controller 。 我在我的微 Controller 上写了一个小程序,如果有输入,它就会
我正在通过制作一个通用的 List 来学习继承类(class)。 List可以是 Unordered列表,Ordered列表,一个 Stack , 或 Queue . 我的 List类看起来像这样:
我必须使用非科学(即无尾数/指数/E)字符串转换十进制数。我的代码如下所示: /*! \brief Converts a XML Schema Decimal */ char *ToDecimal(d
private static void Main(string[] args) { for (;;) { TemporaryCityTool.TemporaryCity
我在 YARN 集群 (HDP 2.4) 中使用 Spark,设置如下: 1 个主节点 64 GB RAM(50 GB 可用) 24 核(19 核可用) 5个从节点 每个 64 GB RAM(50 G
这是我使用 powershell 脚本的第一天我正在尝试使用 VMM Cmdlet Get-SCVirtualMachine当我像 这样使用它时它工作正常 PS C:\> $VM = Get-SCVi
我决定在 RubyMine 7.1.4 中使用远程 Ruby SDK。 设置了 Vagrant 机器( hashicorp/precise32 ),RVM、Ruby 2.2.1p85(2015-02-
我在 sklearn 上使用 Xgboost 实现进行 kaggle 竞赛。但是,我收到此“警告”消息: $ python Script1.py /home/sky/private/virtualen
我是一名优秀的程序员,十分优秀!