前端计算
1、5,512.1913 小数点第2位大于5的 向上取整,
2、173.544 小数点第2位小于5的 向小取整
1、5,512.1913 计算后 得到 5,512.20
2、173.544 计算后 得到 173.54
我重新写了代码,你可以测试一下,看这个有没有问题,我试了好像没啥问题:
function preciseRound(number) {
const factor = 100; // 定义因子,用于将小数点后两位转化为整数进行处理
// 先将数字扩大100倍,取整后还原
let rounded = Math.round(number * factor) / factor;
// 获取小数点后第三位
let decimal = (number * factor * 10) % 10;
// 决定是向上取整还是向下取整
let finalNumber = (decimal >= 5) ?
Math.ceil(number * factor) / factor :
Math.floor(number * factor) / factor;
return finalNumber; // 直接返回数值,不转换为字符串
}
// 测试示例1
let num1 = 5512.1913;
console.log(preciseRound(num1)); // 期望输出: 5512.20
// 测试示例2
let num2 = 173.544;
console.log(preciseRound(num2)); // 期望输出: 173.54
// 边界测试示例1
let num3 = 1000.999;
console.log(preciseRound(num3)); // 期望输出: 1001.00
// 边界测试示例2
let num4 = 500.0004;
console.log(preciseRound(num4)); // 期望输出: 500.00
// 边界测试示例3
let num5 = 5.55;
console.log(preciseRound(num5)); // 期望输出: 5.55
// 边界测试示例4
let num6 = 2;
console.log(preciseRound(num6)); // 期望输出: 2.00
factor
为 100,将数字的小数点后两位转化为整数进行处理。Math.round(number * factor) / factor
对数字进行初步的四舍五入处理,确保初始精度。(number * factor * 10) % 10
获取小数点后第3位的值,如果该值大于等于 5,使用 Math.ceil
;否则使用 Math.floor
。有几个点需要明确下:小数点第2位等于5怎么办;向上取整是向上多少位,比如5.183是取5.19还是5.20,如果是第一种,用下面第一个函数,第二种用下面第二个函数。函数结果有保留一位小数的情况,看你需求再加上补0的操作
function NumFixed(num, digits) {
let exponent = 10 ** digits;
let d = num * exponent | 0
return (d + (String(d).slice(-1) >= 5 ? 1 : 0)) / exponent
}
// 小数点第二位,大于等于5保留1位小数,否则保留2为小数
function NumFixed(num, digits) {
return num.toFixed(digits - (String(num * 10 ** digits | 0).slice(-1) >= 5 ? 1 : 0))
}
方法二完善,结尾补0
function NumFixed(num, digits) {
let isCeil = String(num * 10 ** digits | 0).slice(-1) >= 5
return (isCeil ? Number(num.toFixed(digits - 1)) : num).toFixed(digits)
}
在前端开发中,实现复杂的数字格式化,包括小数点的处理,通常可以通过JavaScript的内置方法或第三方库来完成。对于你提到的具体需求,我们可以使用JavaScript的Math.round()
函数结合一些字符串处理技巧来实现。但是,由于Math.round()
默认是四舍五入到最接近的整数,我们需要对其进行调整以适应小数点后特定位置的取整逻辑。
对于小数点第2位大于5的向上取整:
你可以先将数字乘以100(移动小数点两位),进行四舍五入后,再除以100(恢复小数点位置)。但这里为了“向上取整”,我们可以考虑使用Math.ceil()
(总是向上取整)对乘以10后的数进行操作,然后再除以10。不过,由于是直接处理到小数点后第二位,我们需要稍微调整这个逻辑,先判断第二位是否大于5,如果是,则直接对乘以100的结果加1(如果已经是整数则无需加),再进行除法操作。
function roundUpIfSecondDecimalGreaterThan5(num) {
const parts = num.toString().split('.');
if (parts.length < 2) return num; // 如果没有小数点,直接返回原数
const intPart = parseInt(parts[0], 10);
const decimalPart = parseFloat('0.' + parts[1]);
const secondDecimal = Math.floor((decimalPart * 100) % 10);
if (secondDecimal >= 5) {
return (Math.floor(num * 100) + 1) / 100;
}
return num;
}
console.log(roundUpIfSecondDecimalGreaterThan5(5512.1913)); // 输出 5512.2
注意:这里为了简化处理,我直接将5,512.1913
作为5512.1913
处理,因为通常数字不会以逗号分隔千位。如果确实需要处理带逗号的数字字符串,你需要先将其转换为数值类型。
对于小数点第2位小于5的向小取整:
这个相对简单,直接使用toFixed(2)
可以实现向小取整(实际上是四舍五入到小数点后两位,但由于我们只关心小于5的情况,所以这里直接使用即可)。
function roundDownIfSecondDecimalLessThan5(num) {
return parseFloat(num.toFixed(2));
}
console.log(roundDownIfSecondDecimalLessThan5(173.544)); // 输出 173.54
roundUpIfSecondDecimalGreaterThan5
函数在处理极端情况时(如123.499
),可能不会按预期工作,因为它仅检查第二位小数是否大于或等于5。如果需要更精确的控制(如四舍六入五成双等银行家舍入法),则需要更复杂的逻辑。问题内容: 我想知道如何在不舍入原始数字的情况下输出带两位小数的数字。 例如: 我已经尝试过: 问题答案: 您要使用命令。 https://dev.mysql.com/doc/refman/8.0/zh-TW/mathematical- functions.html#function_truncate
本文向大家介绍JavaScript实现格式化字符串函数String.format,包括了JavaScript实现格式化字符串函数String.format的使用技巧和注意事项,需要的朋友参考一下 在js开发中,我们可能会遇到这样一个问题 当需要通过js动态插入html标签的时候 特别是当遇到大量的变量拼接、引号层层嵌套的情况,会出现转义字符问题,经常出错 我们来看个例子 运行直接报错 接下来把转义
本文向大家介绍Java 实现Redis存储复杂json格式数据并返回给前端,包括了Java 实现Redis存储复杂json格式数据并返回给前端的使用技巧和注意事项,需要的朋友参考一下 问题背景 在Java Web项目中,经常需要前端请求数据,后台从数据库中查询并计算最后返回json格式数据给前端。 而每次请求都需要计算一次可能比较浪费时间,这时我们可以将计算好的结果保存在redis中,下次请求时先
问题内容: 我希望实数是例如12.92,而不是12.9241。有可能这样做吗? 问题答案: 在PHP中,尝试 :
问题内容: 我正在打印一个我不知道其值的数字。在大多数情况下,该数字为整数或结尾为0.5。在某些情况下,该数字以.25或.75结尾,而极少数情况下该数字达到千分之一。我该如何具体检测到最后一种情况?现在,我的代码检测到一个整数(0个小数位),精确地为0.5(1个小数位),然后在所有其他情况下恢复为2个小数点,但是当我需要这样做时,我需要将其改为3。 问题答案: A 使用二进制(IEEE 754)表
问题内容: 我有这行代码将我的数字四舍五入到小数点后两位。但是我得到这样的数字:10.8、2.4等。这些不是我对小数点后两位的想法,因此我如何改善以下内容? 我想要数字10.80、2.40等。使用jQuery对我来说很好。 问题答案: 要使用定点表示法格式化数字,您可以简单地使用toFixed方法: 请注意,它返回一个字符串。 重要说明 :请注意,toFixed不会在90%的时间内舍入,它会返回舍