Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 浮点到整数的转换_C++_C - Fatal编程技术网

C++ 浮点到整数的转换

C++ 浮点到整数的转换,c++,c,C++,C,我读的是小数点后两位的“浮点数”,如下所示: 122 122.3 122.34 并且需要通过相乘将它们转换为整数值(想象存储美元/美分) 例如,18.56将转换为1855 有没有办法将值读取为double并将其正确转换为int TIA存储在浮点中的值将被舍入。乘以10的幂只会放大误差。如果不希望有任何舍入错误,则需要立即将值读入整数,如果需要与值相乘的因子,则可能需要跟踪小数点的位置: std::string tmp; if (std::cin >> tmp) { std:

我读的是小数点后两位的“浮点数”,如下所示:

122
122.3
122.34
并且需要通过相乘将它们转换为整数值(想象存储美元/美分)

例如,
18.56
将转换为
1855

有没有办法将值读取为double并将其正确转换为int


TIA

存储在浮点中的值将被舍入。乘以10的幂只会放大误差。如果不希望有任何舍入错误,则需要立即将值读入整数,如果需要与值相乘的因子,则可能需要跟踪小数点的位置:

std::string tmp;
if (std::cin >> tmp) {
    std::string::size_type decimal_point = tmp.rfind('.');
    int power(0);
    if (decimal_point != tmp.npos) {
        tmp.erase(tmp.begin() + decimal_point);
        power = int(decimal_point) - int(tmp.size());
    }
    int value;
    if (std::istringstream(tmp) >> value) {
        std::cout << "read " << value << "e" << power << "\n";
    }
}
std::string-tmp;
如果(标准::cin>>tmp){
std::string::size_type decimal_point=tmp.rfind('.');
整数幂(0);
如果(小数点!=tmp.npos){
tmp.erase(tmp.begin()+小数点);
幂=int(小数点)-int(tmp.size());
}
int值;
如果(标准::istringstream(tmp)>>值){

std::cout问题在于(通过
scanf
)到float的转换是一种近似值,会丢失预期的精确十进制值。请改用:

int dollars = 0, cents = 0;
scanf("%d.%d", &dollars, &cents);
cents += 100*dollars;

或类似情况。

将整数转换为四舍五入整数的最简单方法:

i = (int)floor(d * 100 + 0.5);
如果您的数字始终为正:

i = (int)(d * 100 + 0.5);
介于1.565和1.575之间的值将变为157。介于2.135和2.145之间的值将变为214

这样,如果你有一个像1.56999这样的数字,它就会变成157

这并不是“解决精度损失”——不管这意味着什么。它只是四舍五入


如果一个值正好介于两个数字之间(例如,d为1.125)在这种情况下,所有的数字只有两个小数点,所以这不是问题。如果数字不限于小数位数,那么你就要更仔细地考虑如何处理数字1.125。如
double
,乘以100,并四舍五入到最接近的整数,将产生正确的结果。(简单地将
double
强制转换为整数将截断,而不是四舍五入到最近值,并且有时会由于浮点舍入错误而产生不正确的结果。您可以使用
round
函数进行四舍五入。)


使用
double
以这种方式处理输入不一定是最好的方法。

OP几乎做到了,只需要添加
round()
和错误检查

round()

像12.34这样的值将导致1234

由于FP问题,1/2分边界处的值(如12.345)可能返回1234或1235,但OP 3示例没有超过0.01

对+或-数字没有问题

#include <math.h>
...
int i;
double d_dollars;
double d_cents;

if (1 != scanf( "%lf", &d_dollars)) handle_error();
d_cents = round(d_dollars * 100.0);
if ((d_cents < INT_MIN) || (d_cents > INT_MAX)) handle_error();
i = (int) d_cents;
#包括
...
int i;
双倍美元;
双d_分;
如果(1!=scanf(“%lf”,&d_$s))handle_error();
d_美分=四舍五入(d_美元*100.0);
if((d_分INT_分>INT_分>INT_分)处理错误();
i=(int)d_分;

请给出一个会导致精度损失的示例,以及您认为应该如何处理。浮点变量中已经存在“精度损失”。将其乘以100不会造成任何损害。如果您真正关心数字,请永远不要使用浮点。很遗憾,请看,不能使用long-long。将输入作为一个string,然后将字符串转换为int(去掉小数后)尽管如此,我同意我的代码并不健壮。例如,它接受一些无意义的东西,如
1.-2
,并错误解释小数点后只有一位数字的输入。重点是建议正确的方法。依我看,这不是正确的方法。如果你从
stdin
读取,第二个
%d
将取下一个整数from输入,即使它不在小数点后。当然,您可以检查返回值,但您无法再读取它。对于“d=x.xx5”之类的值,舍入是有问题的。例如:
double d=1.005;printf(“%d\n”,(int)floor(d*100+0.5));
printed 100以及
double d=0.995;
@chux:问题说数字最多有两位小数。还是编辑答案吧。
#include <math.h>
...
int i;
double d_dollars;
double d_cents;

if (1 != scanf( "%lf", &d_dollars)) handle_error();
d_cents = round(d_dollars * 100.0);
if ((d_cents < INT_MIN) || (d_cents > INT_MAX)) handle_error();
i = (int) d_cents;