typescriptで、桁数を指定して四捨五入する関数を実装したので載せます。
ソースコード
NumberUtil.ts
/**
* 任意の桁で四捨五入する
* @param value 四捨五入する数値
* @param base どの桁で四捨五入するか
* 1: 1の位で四捨五入
* 10: 10の位で四捨五入
* 0.1: 小数第1位で四捨五入
* 0.01: 小数第2位で四捨五入
* @return 四捨五入した値
*/
export function orgRound(value: number, base: number): number {
if (base < 1) {
const digit = String(1 / base).length - 1
return Math.round(value * Math.pow(10, digit)) / Math.pow(10, digit)
}
return Math.round(value / base) * base
}
テストコード
NumberUtil.test.ts
/**
* 四捨五入のテスト
*/
describe('orgRound', () => {
test('100の位', () => {
const base = 100
expect(orgRound(123.0, base)).toBe(100)
expect(orgRound(144.45, base)).toBe(100)
expect(orgRound(155.5, base)).toBe(200)
expect(orgRound(189.9, base)).toBe(200)
})
test('10の位', () => {
const base = 10
expect(orgRound(123.0, base)).toBe(120)
expect(orgRound(124.45, base)).toBe(120)
expect(orgRound(125.5, base)).toBe(130)
expect(orgRound(129.9, base)).toBe(130)
})
test('1の位', () => {
const base = 1
expect(orgRound(123.0, base)).toBe(123)
expect(orgRound(123.45, base)).toBe(123)
expect(orgRound(123.5, base)).toBe(124)
expect(orgRound(123.9, base)).toBe(124)
})
test('小数点第1位', () => {
const base = 0.1
expect(orgRound(123.45, base)).toBe(123.5)
})
test('小数点第2位', () => {
const base = 0.01
expect(orgRound(123.451, base)).toBe(123.45)
expect(orgRound(123.452, base)).toBe(123.45)
expect(orgRound(123.455, base)).toBe(123.46)
expect(orgRound(123.457, base)).toBe(123.46)
})
test('小数点第3位', () => {
const base = 0.001
expect(orgRound(123.1111, base)).toBe(123.111)
expect(orgRound(123.1114, base)).toBe(123.111)
expect(orgRound(123.1115, base)).toBe(123.112)
expect(orgRound(123.1119, base)).toBe(123.112)
})
})