我有下面的数字列表,它们被一一发送给一个函数。
96.487587
96.561569
97.893280
97.967270
98.041245
98.115227
98.855072
98.929054
99.003044
99.890846
99.964836
如何检查点后的值是否为0
,例如:
99.003044 or 98.041245
答案 0 :(得分:8)
由于modf
返回与参数具有相同符号的小数部分,因此请使用小数的绝对值进行测试:
#include <cmath>
bool check(double x)
{
double integral, fractional;
fractional = std::modf(x, &integral);
return std::abs(fractional) < 0.1;
}
答案 1 :(得分:4)
有两种方法可以执行此操作。首先,您可以使用std::modf
并测试返回值(即小数部分)是否小于.1
。看起来像
bool check(double value)
{
double discard;
return std::abs(std::modf(value, &discard)) < .1;
// need the abs for cases when value is negative.
}
另一种选择是从值中减去整个部分,然后查看该值是否小于.1
。您可以使用std::floor
之类的
bool check(double value)
{
return (value - std::floor(value)) < .1;
}
请注意,至少对于某些值,这两个解决方案都因为floating point inaccuracy而失败。为避免这种情况,您可以使用防弹解决方案,将值转换为字符串,然后测试小数点后是否有0
。看起来像
bool check(double value)
{
std::string str = std::to_string(value);
size_t pos = str.find(".");
if (pos == std::string::npos)
return true; // not sure if you want to return true or false for whole numbers
return str[pos + 1] == '0';
}
答案 2 :(得分:2)
执行此操作的唯一100%安全的方法是从double值本身提取此信息。乘以10(如注释中所建议)可能导致数值溢出,以及通过强制转换为整数来获取值的整数部分。
幸运的是,C ++拥有std::modf
的功能。它为您提供double
数字的小数部分,您可以将其与0.1
进行比较。
(如其他答案所示,您也可以使用std::floor
)。
答案 3 :(得分:1)
似乎给出的大多数解决方案都不适用于输入10.1
。这是我取得的成就:
代码:
#include <iostream>
#include <string>
#include <cmath> // std::abs
void isZero(double x){
double total = std::abs (x) - std::abs((int)x);
//std::cout << "Decimal Number: " << total << "\n";
if(((total * 10 + 0.5) / 10.0) < 0.10){
std::cout << x << " True\n";
}else{
std::cout << x << " False\n";
}
}
int main(){
double positive[] = {
96.487587, 96.561569, 97.893280, 97.967270,
98.041245, 98.115227, 98.855072, 98.929054,
99.003044, 99.890846, 99.964836, 10.0, 10.1,
10.2, 10.3, 10.4, 10.5, 10.6, 10.7, 10.8, 10.9,
};
double negative[] = {
-96.487587, -96.561569, -97.893280, -97.967270,
-98.041245, -98.115227, -98.855072, -98.929054,
-99.003044, -99.890846, -99.964836, -10.0, -10.1,
-10.2, -10.3, -10.4, -10.5, -10.6, -10.7, -10.8, -10.9
};
for(int i = 0; i < sizeof(positive)/sizeof(positive[0]); i++){
isZero(positive[i]);
}
for(int i = 0; i < sizeof(negative)/sizeof(negative[0]); i++){
isZero(negative[i]);
}
}
输出:
96.4876 False
96.5616 False
97.8933 False
97.9673 False
98.0412 True
98.1152 False
98.8551 False
98.9291 False
99.003 True
99.8908 False
99.9648 False
10 True
10.1 False
10.2 False
10.3 False
10.4 False
10.5 False
10.6 False
10.7 False
10.8 False
10.9 False
-96.4876 False
-96.5616 False
-97.8933 False
-97.9673 False
-98.0412 True
-98.1152 False
-98.8551 False
-98.9291 False
-99.003 True
-99.8908 False
-99.9648 False
-10 True
-10.1 False
-10.2 False
-10.3 False
-10.4 False
-10.5 False
-10.6 False
-10.7 False
-10.8 False
-10.9 False