如何在除法后的范围(10.25到11)中四舍五入?

时间:2018-09-18 16:44:56

标签: c++ floating-point rounding

对于一个学校项目,我需要计算the年。问题是,我需要对整数进行四舍五入。

例如某人出生于1961年。

double yearsbetween; yearsbetween = birthyear - 1918;

double leapyears; leapyears = ( yearsbetween / 4 );

如果birthyear = 1961我得到leapyears = 10.75,但这是错误的。我必须是11岁。

如果答案为10.25,则需要四舍五入为10。如果答案为10.75,则需要四舍五入为11。

有人可以帮助我吗?

4 个答案:

答案 0 :(得分:2)

您必须专门查看每年以检查leap年。您认为第4年是飞跃是错误的,因为有一些例外情况:

如果它可以被100整除而不能被400整除,则它不是a年。

示例:

  • 1900年不是a年
  • 2000年是a年

请参阅https://en.wikipedia.org/wiki/Leap_year#Algorithm

答案 1 :(得分:1)

假设我们只在a年是那些可以被4整除的年份中工作。

给出一个数字 n ,小于或等于 n 且为4的倍数的正数为floor( n / 4)。令L( n )为该值floor( n / 4)。

如果我们取数字 m ,则直到 m 的4的正整数倍数为L( m )。当我们减去L( n )时,结果L( m )− L( n )是四的倍数比 n 小,但小于或等于 m

因此,从1918年到 m 年的of年数是下限( m / 4)-下限(1918/4)=下限( m / 4)-479。(如果基准年是a年,并且我们希望将其包括在期间内而不是外部,则可以将L( n )替换为L( n n −1)。

以上内容很容易扩展到较大的leap年模式。通过将L( n )更改为floor( n / 4)-floor( n / 100)+ floor( n / 400),它变成一个正数的计数,直到 n 都是4的倍数,但不是100的倍数,除非它们是400的倍数。然后L( m )-L( n )是 n m 之间的跳跃规则数。

因此,此规则覆盖的期间的合适公式为floor( n / 4)-floor( n / 100)+ floor( n < / em> / 400)-464。使用C的整数算法,可以很容易地将其评估为n/4 - n/100 + n/400 - 464

答案 2 :(得分:0)

好像您需要的是std::ceil

我建议您在std::ceil参考中也有指向其他舍入函数的链接。 经历那些。

答案 3 :(得分:0)

因此,这直到才有意义,我什至不得不ask a question弄清楚如何使用chrono::year。但是,如果有的话,最好的解决方案是:

const chrono::year birthyear{ 1961 };
auto leapyears = 0;

for(chrono::year i{ 1918 }; i <= birthyear; ++i) {
    if(i.is_leap()) {
        ++leapyears;
    }
}

我通过从live example派生@HowardHinnant的例子来链接this answer