Hướng dẫn javascript multiplication not correct - phép nhân javascript không chính xác

Tôi đã đến một vấn đề kỳ lạ, tôi muốn thực hiện một số kiểm tra toán cơ bản. Tôi đã đọc để tránh các số nổi vì vậy tôi quyết định nhân các giá trị toán học của mình với 10000, vì giá trị của tôi có thể nằm trong khoảng 0,9 đến 0,0025.multiply my math values with 10000, because my value can be between 0.9 and 0.0025.

Mọi thứ hoạt động chính xác ngoại trừ hai giá trị: 0,56 và 0,57:0.56 and 0.57:

var result = 0.57 * 10000

Kết quả là: 5699.99999999999, tôi hy vọng cho 5700 !! Và 0,56 cũng đi sai nhưng tất cả các giá trị khác đều chính xác, tôi còn thiếu gì ở đây?5699.999999999999, I hoped for 5700!! And 0.56 is also going wrong but all the other values are correct, what am I missing here?

hỏi ngày 3 tháng 4 năm 2012 lúc 12:28Apr 3, 2012 at 12:28

Hướng dẫn javascript multiplication not correct - phép nhân javascript không chính xác

2

Giải pháp tốt nhất sẽ là sử dụng tofixed (x) và đặt X một số số thập phân luôn luôn nhiều hơn số thập phân kết quả dự kiến ​​(tôi thường đặt 8 ở đó).

Nhưng thay vì hack -như kirilloid-, bạn nên chuyển đổi kết quả trở lại số lại, để bất kỳ số thập phân không cần thiết nào được xóa. Sau đó thực hiện bất kỳ định dạng nào bạn thích trên số.

Vì vậy, điều này sẽ trả về kết quả cần thiết:

var result = +(0.57 * 10000).toFixed(8)

Kết quả sẽ là 57005700

+ Ở phía trước, chuyển đổi kết quả chuỗi của "tofixed" thành một số một lần nữa.

Hy vọng điều đó đã giúp!

Chỉnh sửa 2019:

Có vẻ như chúng ta không nên tin tưởng vào điều này theo điều này: http: //stackoverflow.com/questions/661562/how-to-format-a-float-in-javascript/661757#61757 :

function fixRounding(value, precision) {
    var power = Math.pow(10, precision || 0);
    return Math.round(value * power) / power;
}

Đã trả lời ngày 4 tháng 6 năm 2012 lúc 11:45Jun 4, 2012 at 11:45

0

var multiply = function(a, b) {
    var commonMultiplier = 1000000;

    a *= commonMultiplier;
    b *= commonMultiplier;

    return (a * b) / (commonMultiplier * commonMultiplier);
};

Điều này hoạt động trong một phạm vi đã biết. Do đó, nó có thể là một ý tưởng tốt để làm tròn con số đến một điểm thập phân nhỏ hơn commonMultiplier.

> multiply(3, .1)
< 0.3
> multiply(5, .03)
< 0.15

Đã trả lời ngày 16 tháng 1 năm 2013 lúc 14:03Jan 16, 2013 at 14:03

GajusgajusGajus

65.3K68 Huy hiệu vàng264 Huy hiệu bạc425 Huy hiệu Đồng68 gold badges264 silver badges425 bronze badges

Lựa chọn của bạn trong JavaScript (thực sự, trong hầu hết các ngôn ngữ) là số nguyên hoặc số điểm nổi. Nếu bạn viết "0,57", bạn đang buộc nó vào thế giới của điểm nổi, nơi chính xác bị hạn chế.

Nếu bạn muốn độ chính xác tuyệt đối, bạn sẽ cần phải làm việc độc quyền trong các số nguyên.

Đã trả lời ngày 3 tháng 4 năm 2012 lúc 12:32Apr 3, 2012 at 12:32

Hướng dẫn javascript multiplication not correct - phép nhân javascript không chính xác

Colin Finecolin tốtColin Fine

3,3241 Huy hiệu vàng19 Huy hiệu bạc32 Huy hiệu đồng1 gold badge19 silver badges32 bronze badges

var result = 0.57 * 10000;
alert (Math.round(result));​

Đã trả lời ngày 3 tháng 4 năm 2012 lúc 12:32Apr 3, 2012 at 12:32

Colin Finecolin tốtEtienne Dupuis

3,3241 Huy hiệu vàng19 Huy hiệu bạc32 Huy hiệu đồng6 gold badges46 silver badges56 bronze badges

1

Etienne Dupuisetienne Dupuis

13.3k6 Huy hiệu vàng46 Huy hiệu bạc56 Huy hiệu ĐồngApr 3, 2012 at 12:48

Giải pháp Hacky: value.toFixed(4).substr(-4).replace(/^0+/, "");kirilloid

Đã trả lời ngày 3 tháng 4 năm 2012 lúc 12:486 gold badges37 silver badges52 bronze badges

Kirilloidkirilloid

function moveDecimalPointRight(value,power){
    const s = value.toString();
    const a = s.split('.');
    if(a.length>1){
        return Number(a[0]+a[1].substr(0,power)+'.'+a[1].substr(power));
    }else{
        return value;
    }
}
function moveDecimalPointLeft(value,power){
    const s = value.toString();
    const a = s.split('.');
    const _al = a[0].length;
    while(a[0].length1){
        return Number(
            a[0].substr(0,a[0].length-power)
            +'.'+a[0].substr(-power)
            +a[1]);
    }else{
        return Number(
            a[0].substr(0,a[0].length-power)
            +'.'+a[0].substr(-power));
    }
}
function afterDecimal(num) {
    if (Number.isInteger(num)) {
      return 0;
    }
    return Number(num).toString().split('.')[1].length;
}
function correctMultiply(a,b) {
    const _ad = afterDecimal(a);
    const _bd = afterDecimal(b);
    const _a = moveDecimalPointRight(a,_ad);
    const _b = moveDecimalPointRight(b,_bd);
    const _r = _a * _b;
    return moveDecimalPointLeft(_r,_ad+_bd);
}
console.log(correctMultiply(0.57,10000));
console.log(correctMultiply(0.57,0.57));

13.7K6 Huy hiệu vàng37 Huy hiệu bạc52 Huy hiệu ĐồngOct 26 at 16:05