C# 如何使这种舍入算法适用于负数?
我用C#编写了这个简单的舍入方法,它将任何浮点数(输入)舍入到任何目标数(目标)的最近倍数:C# 如何使这种舍入算法适用于负数?,c#,algorithm,math,rounding,C#,Algorithm,Math,Rounding,我用C#编写了这个简单的舍入方法,它将任何浮点数(输入)舍入到任何目标数(目标)的最近倍数: float RoundToFloat(浮点输入,浮点目标) { 浮动商=输入/目标; if(商-数学楼层(商)
float RoundToFloat(浮点输入,浮点目标)
{
浮动商=输入/目标;
if(商-数学楼层(商)<.5)
{
返回数学下限(商)*目标;
}
其他的
{
返回数学单元(商)*目标;
}
}
然而,当输入为负数时,这似乎会中断。我该怎么做才能让它工作?我尝试过计算商的绝对值,如果输入为负数,我会翻转是否使用ceil/floor,但无论哪种方式都会得到奇怪的结果
任何建议都将不胜感激 明白了。。。对于负数,您需要反向应用
下限
和上限
,因为四舍五入必须是相对于0的“正确方向”。
Floor
总是更负,而天花
则相反
您可以在if
中添加一个“简单”的“iff”,也称为“Boolean equals”
if(商-数学下限(商)<.5)==
(商>=0){
什么是目标
?另外,您已经在使用的数学
库中提供了舍入功能。@Sach参见我文章的第一句。内置的“舍入”方法简单地四舍五入到最接近的整数,即1的倍数。假设我希望它是3的倍数,或5的倍数,或18.5的倍数,或任何东西。这就是target的目的。因此,例如,如果我想将8.2四舍五入到最接近的3的倍数,答案将是9。我试图回答的问题是如何处理负输入。因此,如果我想将-17舍入到最接近的倍数3的st倍数,我想得到-18。好了,知道了,这不适用于什么负数了吗?我尝试了一些像-5.23f
,-7.83f
,和-8.83f
,它似乎工作得很好。不过我确实使用了C#数学
库;我不知道这Mathf
是什么。@SachMathfork。它与数学
,不同之处在于它与浮点数一起工作。欢迎使用StackOverflow。请参阅。在您发布MRE代码并准确指定问题之前,我们无法有效帮助您。我们应该能够将您发布的代码粘贴到文本文件中,并重现您指定的问题。
float RoundToFloat(float input, float target)
{
float quotient = input / target;
if (quotient - Mathf.Floor(quotient) < .5)
{
return Mathf.Floor(quotient) * target;
}
else
{
return Mathf.Ceil(quotient) * target;
}
}
if (quotient - Mathf.Floor(quotient) < .5) ==
(quotient >= 0) {