我有一个带有数据成员的类,该成员需要四舍五入为2位整数,而与输入位数无关。

例如:

roundUpto2digit(12356463) == 12 
roundUpto2digit(12547984) == 13 // The 5 rounds the 12 up to 13.

目前,我的代码如下:

int roundUpto2digit(int cents){
    // convert cents to string
    string truncatedValue = to_string(cents);
    // take first two elements corresponding to the Most Sign. Bits
    // convert char to int, by -'0', multiply the first by 10 and sum the second 
    int totalsum =  int(truncatedValue[0]-'0')*10 + int(truncatedValue[1]-'0');
    // if the third element greater the five, increment the sum by one
    if (truncatedValue[2]>=5) totalsum++; 
    return totalsum;
} 

任何使它不那么丑陋的建议将深表赞赏。

#1楼 票数:1 已采纳

您可以使用定点整数算术,它可能更快并且看起来更好。 您希望数字的比例为10 ^ 2,并且还具有10的任意比例幂,因此要四舍五入,您只需要应用以下公式:

ROUNDED_VAL = (INITIAL_VAL + (10^(ORIG_SCALE - 2) / 2)) / 10^(ORIG_SCALE - 2)

因此您的代码可能如下所示:

int roundUpto2digit(int cents){
    int scale = 10;
    while(cents / scale > 0) {
        // Find out original scale. This can be done maybe faster with a divide and conquer algorithm 
        scale *= 10;
    }
    int applied_scale = scale / 100;
    if (applied_scale == 0) {
        // In case there is only one digit, scale it up to two
        return 10 * cents;
    }
    return ((cents + (applied_scale / 2)) / applied_scale);
} 

编辑:我写的10 * cents是我根据我的解释做出的问题的任意推断。 如果这不是所需的行为,则可以更改。

#2楼 票数:0

#include <math.h>

int roundUpto2digit(int value)
{
    value /= pow(10,(int)log10(value)-2);
    /*
    (int)log10(value) returns base ten logarithm (number of digits of your number)
    pow(10, N) returns number 1 followed by N zeros
    example:
    pow(10,(int)log10(123)-2) returns 1
    pow(10,(int)log10(1234)-2) returns 10
    pow(10,(int)log10(1234567)-2) returns 10000
    thus
    value / pow(10,(int)log10(value)-2) returns first 3 digits
    */
    return value%10>=5? (value+10)/10 : value/10;
    /*
    if(value%10>=5)// the last digit is >= 5
    {
    // increase previous number
    value = value + 10;
    }
    // return number without the last digit
    return value/10;
    */
}

  ask by Ziezi translate from so

未解决问题?本站智能推荐:

1回复

截断为Two的补码? [关闭]

关闭。 这个问题是题外话。 它当前不接受答案。 了解更多 。 想改善这个问题吗? 更新问
3回复

这是截断数字的有效方法吗?

我在SO答案中发现此代码是一种在Javascript中将数字截断为整数的方法: 这是在Javascript中截断数字的有效方法,还是某种黑客攻击? 为什么它仅适用于小于2147483647的数字?
2回复

java整数舍入(除法相关)

我已经遇到了整数除法的惊喜而没有像预期的那样四舍五入。 简单代码: 即使使用显式(浮点)强制转换,输出也是: 我一直期待-1一路下来。 发生这种情况的真实代码是这样的: RealisticFluids.MAX_FLUID具有值(1 << 20)。
1回复

R整数比较似乎忽略了位数

我有一维的坐标,它描述了一个段的开始和结束。 我正在尝试编写一个函数,它告诉我一个段在另一个段内。 这就是我所拥有的,在这种情况下,看看b是否在a内: 问题是,它似乎并没有考虑数字的不同长度,例如: 好像两个数字从第一个开始并排放置,并且所有不重叠的部分都会被截断。 我对这
1回复

Java中Swifts整数“溢出运算符”&*、&+和&-的等价物是什么?

Swift 为整数运算提供了所谓的“溢出运算符”&*、*+、&-( Swift 高级运算符)。 它们旨在在执行会导致溢出的操作时截断可用位的数量。 例如: 由于 Java 不支持无符号整数,因此可能没有真正的等价物。 在 Java 8 中,有Integer.toUnsigned
1回复

有截断吗?

我试图计算一个球的半径,如果我的皮革面积为4195065486 mm2,厚度为1 mm,从半径为1 mm的小球开始,制造商可以将皮革包裹在球周围。 我编写了这段代码来获得可以制作的球的半径以及从皮革中留下的区域。 (假设pi = 3.14159)。 是否存在可能导致A不准确结果的截断
3回复

不同编译器中 C++ 和 C 之间的无符号位域整数表达式截断不一致

编辑2 : 当以前驻留在 C++ 源文件中但逐字移入 C 文件的函数开始返回不正确的结果时,我正在调试一个奇怪的测试失败。 下面的 MVE 允许重现 GCC 的问题。 然而,当我一时兴起用 Clang(后来用 VS)编译这个例子时,我得到了不同的结果! 我不知道是将其视为其中一个编译器中的错误,还
2回复

C ++截断错误?

我正在学习C ++,并在尝试使用公式来计算电流时遇到了这个问题。 我得到: 0.628818答案应该是: f = 200赫兹 R = 15欧姆 C = 0.0001(100µF) L = 0.01476(14.76mH) E = 15伏