我面临的问题是因为我正在使用一个库,当输入 a 时float,它会在内部执行一些操作,将 float 转换为 double 并向不正确的数字添加很多小数。我的意思是,根据双打和浮点数的表示方式以及投射时自然发生的情况,这是正确的,但它不适合我的应用程序。我有16.3asfloat并且我需要它是16.3as double。
我试图在将值传递给库之前将浮点数转换为 double 以控制该转换,但到目前为止我还没有找到一种简单的方法。我只是想知道是否有可能从float到投射 16.3double并得到相同的 16.3 结果。
float f_var = 16.3; // f_var is 16.3
double d_var = (double)f_var; // d_var shall be also 16.3, not 16.299999237060547
Run Code Online (Sandbox Code Playgroud)
在 C++ 中是否有正确的方法来做到这一点?或者我必须做类似的事情:
char float_buf[10];
float f_var = 16.3;
sprintf(float_buf, "%.2f", f_var);
double d_var = atof(float_buf);
Run Code Online (Sandbox Code Playgroud)
因为这是可行的,但我想看看在 C++ 中是否有一种“正确”的方法来做到这一点。
SO 中有另一个建议的解决方案,但它涉及乘法和除法,我也想避免。
这不是用于显示或任何输入/输出操作或转换为字符串,我知道如何做到这一点并且有很多关于它的信息。此外,我并不是想理解“为什么”会发生这种情况,还有很多关于此的信息。
另外,SO中可能导致这个问题被标记为重复的大多数答案都不是针对C++的,它们主要是针对C#、Java JS、Objective C等的。对于我发现的关于C/C++的少数答案,大多数都是针对C/C++的。正在用printfor处理 IO 的这个问题,cout其他人只解释为什么会发生这种情况,这也是没有用的。如果您确实有一个完全用 C++ 编写的重复项,请指出。如果确实如此,我会很高兴将其标记为重复。
谢谢!
这个答案假设 IEEE 浮点。
诸如此类的机器数据类型float包含有限数量的位,因此只能表示有限数量的值。唉,16.3碰巧不是其中之一。
float f_var = 16.3;
Run Code Online (Sandbox Code Playgroud)
现在的值f_var是 (1) 可表示为单精度浮点数以及 (2) 尽可能接近的数字16.3。这个数字恰好是16.299999237060546875。这是最接近的一种16.3。下一个较大的可表示数字是16.3000011444091796875,距离相当远。如果你好奇的话,这两个的二进制表示是01000001100000100110011001100110和。01000001100000100110011001100111它们仅在最后一点不同。
double d_var = (double)f_var;
Run Code Online (Sandbox Code Playgroud)
你瞧, 的值d_var现在是完全相同的数字16.299999237060546875。
这是最接近的double数字吗16.3? 一定不行!
double可以准确地表示16.300000000000000710542735760100185871124267578125哪个更接近16.3then 16.299999237060546875。
但为什么要d_var取这个更精确的值呢?它已经被展示了16.299999237060546875,而且现在它是相当忠实的16.299999237060546875。如果您希望它更精确,请为其分配更精确的值。它不是一个有知觉的存在,也不知道你的意思。16.29999923706054687516.3
从哪里可以得到如此精确的值呢?
那么,人们可以任意决定所有有趣的数字在小数点后不超过一位,并且在小数点后有无数个零。(为什么有人会认为这超出了我的能力范围,但我正在配合)。如果是这样的话,那么
d_var = round(d_var * 10)/10
Run Code Online (Sandbox Code Playgroud)
会将数字四舍五入为非常接近小数点后有一位小数位且其后有无数个零的数字。如果我们用这个招数16.299999237060546875,它就会变成16.300000000000000710542735760100185871124267578125。
如果您对小数点后两位数字感兴趣,请将 10 替换为 100 等。但是,此时您应该问问自己浮点类型是否是适合该工作的工具。也许您需要定点十进制数?
另一方面,如果您对最初有多少位数的数字感兴趣,那么您必须提供该位数,并且可能将其与数字本身一起记住。此时你应该更加认真地问自己上述问题。
| 归档时间: |
|
| 查看次数: |
936 次 |
| 最近记录: |