我们正在用 Javascript 构建一个表格,其中 Handsontable 表示货币金额。我们为用户提供了以两位小数或不带小数位的方式呈现金额的可能性(这是客户的要求)。然后我们发现这样的事情:
Column A Column B Column C = A + B
-------------------------------------------
-273.50 273.50 0 Two decimals
-273 274 0 No decimals
Run Code Online (Sandbox Code Playgroud)
调查一点,我们来到地发现,在JavaScript中的基本功能四舍五入,Math.round(),是这样工作的:
如果小数部分正好是 0.5,则参数将四舍五入到 +? 方向上的下一个整数。注意,这不同于许多语言
round()功能,这往往圆这种情况下为下一个整数远离零,而不是(在负数的情况下给予不同的结果与正好0.5的小数部分)。
当我们处理货币金额时,我们不关心小数点后第二位会发生什么,因此我们选择将 -0.0000001 添加到表中的任何负值。因此,当渲染带有两位小数或不带小数的值时,现在我们得到了正确的结果,如Math.round(-273.5000001)= -274,并且Math.round(-273.4900001)仍然是 -273。
尽管如此,我们希望找到一个更好的解决方案来解决这个问题。那么实现这一目标的最好、最优雅的方法是什么(不需要修改原始数值)?请注意,我们不直接调用Math.round(x),我们只是告诉 Handsontable 用给定的小数位数格式化一个值。
假设你有这样的enum类型:
public enum Type
{
A, B, C, D, E, F
}
Run Code Online (Sandbox Code Playgroud)
然后你想根据一些值做一些事情,所以你创建一个切换句子:
switch (type)
{
case Type.A: // Do something
break;
case Type.B: // Do something
break;
case Type.C: // Do something
break;
}
Run Code Online (Sandbox Code Playgroud)
这编译并且工作正常,但随后Sonarqube 5.2(使用C#的默认规则)检查代码并抱怨switch没有默认情况(它将其限定为主要问题).所以你将代码更改为:
switch (type)
{
case Type.A: // Do something
break;
case Type.B: // Do something
break;
case Type.C: // Do something
break;
default: // Do nothing
break;
}
Run Code Online (Sandbox Code Playgroud)
但是接下来是SharpDevelop抱怨,默认情况并告诉你代码不应该存在,因为它什么都不做.
所以你最终将代码更改为一个if句子:
if (type == Type.A) // Do something
else …Run Code Online (Sandbox Code Playgroud)