- 用戶選擇以英尺為單位的高度。例如 6 英尺 0 英寸
- 用戶按下保存按鈕。高度以cm的形式保存到db中
- 用戶現在可以看到從 db 獲取的高度為 cm 并轉換回英尺和英寸
- 由于 Javascript 四舍五入,用戶的高度與他選擇的英尺和英寸不同
- 如何準確地將英尺和英寸存盤為厘米并使其值與用戶選擇的值相同?
我們使用 Realm 作為本地資料庫。
const testConversion = (feet: number, inches: number) => {
const cmTotal = feet * 30.48 inches * 2.54;
const feetNew = Math.floor(cmTotal / 30.48);
// How to have inches match up?
const inchesNew = (cmTotal % 30.48) * 0.393701;
expect(feetNew).toEqual(feet);
expect(inchesNew).toEqual(inches);
};
// 12 inch in a feet
// tallest man about is about 9 feet
describe("Height conversion from metric to imperial", () => {
it("Amount of stone and lb should stay the same", () => {
testConversion(6, 0);
for (let feet = 0; feet < 9; feet ) {
for (let inches = 0; inches < 12; inches ) {
testConversion(feet, inches);
}
}
});
});
結果:
● 測驗套件運行失敗
expect(received).toEqual(expected) // deep equality
Expected: 0
Received: 12.000006479999998
8 |
9 | expect(feetNew).toEqual(feet);
> 10 | expect(inchesNew).toEqual(inches);
| ^
11 | };
以不同的方式舍入英寸似乎無濟于事,最終結果總是以某種方式偏離。除了將英尺和英寸保存到 db 中的單獨欄位之外,您知道如何做嗎?
uj5u.com熱心網友回復:
浮點計算永遠不會準確(浮點數學是否被破壞?)。因此,您的cmTotal % 30.48輸入(cmTotal % 30.48) * 0.393701;存在問題。
您期望:182.88 % 30.48結果0但是,30.479999999999993由于浮點算術的不準確而導致。
您想要做的是,結果newInch取決于您計算的結果feetNew:
(cmTotal - feetNew * 30.48) * 0.393701;
在您的測驗中,您不應該這樣做,expect(inchesNew).toEqual(inches);因為您不能期望此類轉換的數量完全相等。你總會有一些小錯誤。所以你可能想使用類似的東西toBeCloseTo。
let feet = 6
let inches = 0
const testConversion = (feet, inches) => {
const cmTotal = feet * 30.48 inches * 2.54;
const feetNew = Math.floor(cmTotal / 30.48);
// How to have inches match up?
const inchesNew = (cmTotal - feetNew * 30.48) * 0.393701;
console.log(feet, feetNew)
console.log(inches, inchesNew)
};
testConversion(6, 0)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/350702.html
標籤:javascript 打字稿
上一篇:動態道具取決于其他道具
