如何指定小数点后有多少个数字?

时间:2017-08-30 19:01:57

标签: c++

有没有办法确定我的小数点后两位数有多少数字。例如double a=3.14259

如果我现在制作一个新的int b,我怎样才能使b的值等于a小数点后的数字?

4 个答案:

答案 0 :(得分:2)

简短的回答是,你不能。

首先,类似double的类型在(二进制)句点之后总是具有相同数量的二进制数字。那叫做尾数。在双精度为53位的情况下,意味着在二进制周期之后为52位,在十进制中为大约15位。有关详细信息,您可以查看IEEE_754 (double precision)

将double转换为十进制字符串时,通常不会匹配精确的十进制数。例如,值0.1无法用double值精确表示。 printf可以显示" 0.1"在应用舍入后。

但是,当您处理一些双重计算时,您会遇到0.100000000000120.09999999999987这样的小推导。在这种情况下你会做什么?

还有一个与c ++双打无关的数学问题:

                     _
  0.1 is equal to 0.09

所以你的回答是1或无穷大

答案 1 :(得分:0)

这是一种方法:将小数转换为字符串,并查找小数点后子字符串的大小,如下所示:

#include <iostream>
#include <string>

int main()
{
    double a = 3.14259;
    std::string a_string = std::to_string(a);
    a_string.erase ( a_string.find_last_not_of('0') + 1, std::string::npos ); //Get rid
                                                                      //of extra zeroes
    std::cout << a_string.substr(a_string.find('.') + 1).size() << "\n";
    //Print the size of the substring of the original string from the decimal point (here 5)
}

答案 2 :(得分:0)

您可以将小数部分视为字符串文字。利用std::stringstreamstd::string

#include <iostream>
#include <string>
#include <sstream>
int main(){
    double whole = 3.14259;
    auto fractionalno = whole - static_cast<long>(whole); // or use std::modf()
    std::stringstream ss;
    ss << fractionalno;
    std::string s = ss.str();
    s.erase(0,2);
    std::cout << "The number of digits is: " << s.size();
}

答案 3 :(得分:-2)

浮点数不提供点后的位数。 (它甚至不是&#39;确切的值。这是一个近似值。)

但是如果你只是想让另一个整数在屏幕上的点之后具有相同的位数,为什么不算数呢?

这是Python代码:

a = 4.0 / 7
# a is 0.5714285714285714 
b = str(a)
# b (str(a)) is 0.571428571429, different with a.
nod = len(b[b.index('.'):])
_c = 9.0 / 7
c = float(int(_c * 10 ** nod)) / 10 ** nod