这是我的代码
#include <sstream>
#include <iomanip>
#include <string>
#include <iostream>
int main(int ac, char **av)
{
if (ac > 1)
{
std::string input = av[1];
std::stringstream ss;
double output;
ss << input;
ss >> output;
std::cout << std::fixed << std::setprecision(2) << output << std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用stringstreams将字符串转换为double.
它很有用,但是当使用非常大的数字时它会非常奇怪:
./a.out 999999999999999999999999
999999999999999983222784.00
./a.out 42
42.00
Run Code Online (Sandbox Code Playgroud)
我该如何处理所有双重值?
我有一些双数,例如 :3.0 3.1 4.0 5.2等。
我可以判断数字是否以.0喜欢3.0和结尾4.0吗?
有没有最好的方法呢?
PS:我将它们转换为 String 类型,但是我认为这不是最好的方法。
double i = 3.0;
String d = i + "";
return d.endsWith(".0");
Run Code Online (Sandbox Code Playgroud) 还有,为什么浮点不应使用货币的操作和可爱的例子给出的SO的大讨论在这里从Bloch的Effective Java的.
我正在玩这个,发现一些奇怪的东西.如果数字是双倍的:
System.out.println(1.03d - .42d);
//prints out 0.6100000000000001.
Run Code Online (Sandbox Code Playgroud)
但是,如果数字是浮点数:
System.out.println(1.03f - .42f);
//prints out 0.61.
Run Code Online (Sandbox Code Playgroud)
为什么这对浮子也不会以同样的方式失败?两种类型都容易出现同样的问题,但是导致行为差异的原因是什么?
令人震惊的是,这种情况发生了,我没有解释.由visual studio创建的简单控制台应用程序:
#include <stdlib.h>
#include <crtdbg.h>
#include "stdafx.h"
#include "ConsoleApplication.h"
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
double a;
a = 3.4;
return 0; // <======= Debug break point set here
}
Run Code Online (Sandbox Code Playgroud)
其值为a3.3999999999999999而不是3.4.对于大多数程序员来说这不是问题,但为什么数字3.4不能完全存储为double?考虑二进制它没有意义.
我花了差不多整天试图弄清楚为什么会发生这种情况,如果它不是一个完整的数字直到它是一个整数,我的代码会增加一个浮点数,我会通过递增0.01和循环来触发它继续将它递增0.01直到它是一个整数然而它永远不会停止,调试它我注意到随着循环的进展而变得越来越不准确的数字导致它在结束时被0.0000066输出.
我想也许这个变量可能是以某种方式被别处访问所以我只是在一个空的"主"程序中创建它:
float value = 0;
for (int i=0; i<100; i++) {
value += 0.01f;
}
System.out.println(value); // Displays 0.99999934
System.out.println(value == 1); // Just in case it's displaying wrong in println (displays false)
Run Code Online (Sandbox Code Playgroud)
到底为什么这不是1?我不认为它可能与数据类型有任何关系,因为我正在向浮点数添加浮点数.
在执行过程中,
我只是打开了即时窗口,我输入了这样的,
?1.66 + 0.83
Run Code Online (Sandbox Code Playgroud)
因此,此表达式显示以下内容,
2.4899999999999998
Run Code Online (Sandbox Code Playgroud)
实际上该表达式应该已经返回2.49但是返回相同的值并使用不同的浮点数.这有什么问题.?有没有可用于解决此问题的工作.?顺便说一句,我不想格式化上述值.