Boost::Lexical_cast的精度改进
Lexical_cast函数模版为以文本表示的任意的类型之间的转换提供了方便和一致的形式。它提供的简化形式是在表达式级别上的简单性易用性。
现象:
1 2 3 4 5 | string s = "123456.78932323" ; float f = boost::lexical_cast< float >(s); //转过后的结果是123456.79 double d_f = boost::lexical_cast< float >(s); //转过后的结果是123456.7890656 double d = boost::lexical_cast< double >(s); //123456.78932323000 --总共为17位 |
早起的版本对于Lexical_cast的精度默认值总是设置为6;
而最近的1.4版本,查看源码,发现其已根据所转换的类型的默认精度来设置其转换精度:
1 2 3 4 5 6 7 8 9 10 11 12 | template < typename InputStreamable> bool operator>>(InputStreamable& output) { lcast_set_precision(stream, static_cast <InputStreamable*>(0)); } inline void lcast_set_precision(std::ios_base& stream, T*) { stream.precision(lcast_get_precision<T>()); } |
float为:9
double:17:
string类型的为:118
windows平台
如果需要精确的转换精度,目前lexical_cast没有提供精度设置接口,可以自己写一个加上,不过少了可移植性,boost官方文档上给出说明:
对于更多相关的转换,比如比lexical_cast提供的默认行为更为精确的或者需要更严密的格式转换控制,推荐传统的stringstream。
1 2 3 4 5 | double dble = 123456.7893232338; std::stringstream ss; ss.precision(20); ss << setw(15) << dble; string ssd = ss.str(); //转过后的结果:123456.7893232338 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述