分割后如何舍入范围内的数字(10.25到11)? [重复]

问题描述 投票:-4回答:4

这个问题在这里已有答案:

对于学校项目,我需要计算闰年。问题是,我需要围绕int。

例如,有人出生于1961年。

double yearsbetween; yearsbetween = birthyear - 1918;

double leapyears; leapyears = ( yearsbetween / 4 );

如果birthyear = 1961我得到leapyears = 10.75,但那是错误的..我需要11岁。

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

有人能帮我吗 ?

c++ floating-point rounding
4个回答
2
投票

你必须特别注意每年检查闰年。由于存在一些例外情况,因此您认为每四年的跳跃是错误的:

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

例子:

  • 1900年不是闰年
  • 2000年是闰年

https://en.wikipedia.org/wiki/Leap_year#Algorithm


1
投票

假设我们只在闰年是那些年,而只有那些年可以被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年之间的闰年数是楼层(m / 4) - 楼层(1918/4)=楼层(m / 4) - 479.(如果基准年是闰年,我们想要将它包含在句子内而不是外面,我们可以用L(n-1)代替L(n)。

上述内容很容易扩展到更大的闰年模式。通过将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 / 400) - 464.使用C的整数运算,这很容易被评估为n/4 - n/100 + n/400 - 464


0
投票

好像你需要的是std::ceil

您还可以在std::ceil参考中找到其他舍入函数的链接,我建议您也浏览这些函数。


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

© www.soinside.com 2019 - 2024. All rights reserved.