【问题标题】:Transform rational numbers to integers将有理数转换为整数
【发布时间】:2012-12-17 22:31:54
【问题描述】:

如何将1.2423445.314 等有理数转换为12423445314 等整数,同时获得小数位数?

【问题讨论】:

  • 简单算法:去掉小数点...
  • @fpiro07 在这种情况下,您的问题甚至没有意义。你不能说1.234 真的是1.234,因为不能保证它可以用float 精确表示。也可能是1.23399999374...
  • 45.314 不是十进制数 43.314,而是它的浮点近似值。尝试执行char const* str = "43.314";,然后执行for(char const* it=str; *it; ++it) { if (*it != '.') std::cout << *it; } 以获取有效方法的示例。但是,这在很大程度上取决于您的输入格式。
  • @fpiro07 正是托尼·霍普金森的回答。
  • 如果您的输入是double,则答案是“这个问题没有意义”。 doubles 是 x/2^n 形式的有理数,其中 x 是整数(加上一些不寻常的状态,例如 NaN 和无穷大和 -0。它们不是 12.345 形式的数字-- 没有将12.345 表示为double,只有近似值。你可以近似一个答案,但这只是一个近似值。误解这一点会导致很多很多问题。

标签: c++ integer decimal digits rational-numbers


【解决方案1】:

转换成字符串

找到小数点的位置。

从上述字符串的长度中减去小数位数。

然后从字符串中取出点。

【讨论】:

    【解决方案2】:
    int i=0;
    float a = 1.24234;
    
    for(i; i<20; i++){
        float b=pow(10,i);
        if((a*b)%10==0)
            break;
    }
    int c = pow(10,i-1);
    int result = a*c;
    

    我认为这段代码会对你有所帮助。

    【讨论】:

    • 这就是我所说的。这基本上坏了。
    • 嗯,很贵,而且要进行测试以确保值 >= 1 会很好
    【解决方案3】:

    如果你的号码是 W.D(Whole.Decimal)

    要获得 W,只需执行 (int)W.D. 要获得 D,您可以执行 W.D - (int) W.D

    现在你的整数和小数点分开了。要计算出 W 上的 x10 乘数,请继续将 D 除以 10,直到得到小于 10 的结果。

    现在:WxN+D (其中 N 是你除以 10 的次数)

    注意:我没有写代码作为例子,因为我觉得这可能是一个家庭作业。此外,如果您使用的时间很长(即:精确的浮点数),这将不成立,并且可能会溢出。在实施这样的事情之前检查你的界限。

    【讨论】:

      猜你喜欢
      • 2011-10-05
      • 1970-01-01
      • 2011-04-04
      • 1970-01-01
      • 2017-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多