C++ 除法后如何对数字进行四舍五入(10.25到11)?

C++ 除法后如何对数字进行四舍五入(10.25到11)?,c++,floating-point,rounding,c++20,C++,Floating Point,Rounding,C++20,对于学校项目,我需要计算闰年。问题是,我需要舍入整数 例如,有人出生于1961年 double yearsbetween; yearsbetween = birthyear - 1918; double leapyears; leapyears = ( yearsbetween / 4 ); 如果生日=1961年,我得到的闰年=10.75,但那是错误的。。我需要11岁 如果答案是10.25,则需要四舍五入到10。如果答案是10.75,则需要四舍五入到11 有人能帮我吗?看来你需要的是 我建议

对于学校项目,我需要计算闰年。问题是,我需要舍入整数

例如,有人出生于1961年

double yearsbetween; yearsbetween = birthyear - 1918;

double leapyears; leapyears = ( yearsbetween / 4 );
如果生日=1961年,我得到的闰年=10.75,但那是错误的。。我需要11岁

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


有人能帮我吗?

看来你需要的是

我建议您在std::ceil引用中还有一个指向其他舍入函数的链接
也会经历这些

你必须特别注意每一年来检查闰年。您将每四年作为闰年的假设是错误的,因为有一些例外:

如果它可以被100整除,也不能被400整除,那么它就不是闰年

示例:

1900年不是闰年 2000年是闰年
请看

假设我们只在闰年是那些年的时期工作,并且只有那些年可以被四整除

给定一个数n,小于或等于n的正数是4的倍数为floorn/4。设Ln为该值,floorn/4

如果我们取一个数m,四到m的正倍数是Lm。当我们减去Ln,结果是Lm−Ln,是大于n但小于或等于m的四的倍数

因此,1918年和m年之间的闰年数为floorm/4− 地板1918/4=地板/4− 479如果基准年是闰年,我们想把它包括在周期内,而不是在周期外,我们可以用Ln代替Ln−一,

上述情况很容易扩展到更大的闰年模式。通过将Ln更改为地板/4− floorn/100+floorn/400,它变成了一个正数计数,最大n是4的倍数,但不是100的倍数,除非它们是400的倍数。然后是Lm− Ln是n和m之间的跳跃规则数


因此,适用于本条规则所涵盖期间的适当公式为floorn/4− 地板/100+地板/400− 464使用C的整数算法,这很容易被计算为n/4-n/100+n/400-464。

所以这在之前是不相关的,我甚至不得不弄清楚如何使用它。但最好的解决方案(如果可用)是:

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

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

我已经通过forking的例子链接了。

你能展示一下你是如何计算闰年的吗?你根本不需要四舍五入。为什么在处理整型值(如年份)时使用浮点数?11/4实际上是2.75,而不是10.75。我想你的意思是1961-1918/4=10.75。编程需要精确,就像数学一样!我认为你不能用算术公式来确定闰年的数量。我认为您需要从第一年迭代到最后一年,并计算闰年。std::ceil将为您做这件事。虽然这回答了字面上的问题,但并没有指出OP的公式有缺陷,会为某些日期范围添加额外的闰年。这是真的,我只回答了字面上的问题。我的错在那里。