繁体   English   中英

需要帮助的Javascript

[英]Need help for Javascript

我需要JavaScript的帮助。 我正在为一个小的在线商店使用一个简单的js文件。 演示页面的URL为: http ://www.k-prim.biz/Esther/Store/proba.html我使用的javascript称为orderform04.js。 有一个错误:输入product1的数量3-价格为4.8时,结果是14.399999999999999,而不是14.4!

有人可以帮助解决这个问题吗?

javascript也在这里:

function OrderForm(prefix, precision, firstChoice) {

this.prefix = prefix ? prefix : '';

// ****************************
// Configure here
// ****************************
// names - Set these according to how the html ids are set
this.FORM_NAME = this.prefix + 'frmOrder';
this.BTN_TOTAL = this.prefix + 'btnTotal';
this.TXT_OUT = this.prefix + 'txtTotal';

// partial names - Set these according to how the html ids are set
this.CHK = this.prefix + 'chk';
this.SEL = this.prefix + 'sel';
this.PRICE = this.prefix + 'txtPrice';

// precision for the decimal places
// If not set, then no decimal adjustment is made
this.precision = precision ? precision : -1;

// if the drop down has the first choice after index 1
// this is used when checking or unchecking a checkbox
this.firstChoice = firstChoice ? firstChoice : 1;
// ****************************

// form
this.frm = document.getElementById(this.FORM_NAME);

// checkboxes
this.chkReg = new RegExp(this.CHK + '([0-9]+)');
this.getCheck = function(chkId) {
    return document.getElementById(this.CHK + chkId);
};

// selects
this.selReg = new RegExp(this.SEL + '([0-9]+)');
this.getSelect = function(selId) {
    return document.getElementById(this.SEL + selId);
};

// price spans
this.priceReg = new RegExp(this.PRICE + '([0-9]+)');

// text output
this.txtOut = document.getElementById(this.TXT_OUT);

// button
this.btnTotal = document.getElementById(this.BTN_TOTAL);

// price array
this.prices = new Array();

var o = this;
this.getCheckEvent = function() {
    return function() {
        o.checkRetotal(o, this);
    };
};

this.getSelectEvent = function() {
    return function() {
        o.totalCost(o);
    };
};

this.getBtnEvent = function() {
    return function() {
        o.totalCost(o);
    };
};

/*
 * Calculate the cost
 * 
 * Required:
 *  Span tags around the prices with IDs formatted
 *  so each item's numbers correspond its select elements and input checkboxes.
 */
this.totalCost = function(orderObj) {
    var spanObj = orderObj.frm.getElementsByTagName('span');
    var total = 0.0;
    for (var i=0; i<spanObj.length; i++) {
        var regResult = orderObj.priceReg.exec(spanObj[i].id);
        if (regResult) {
            var itemNum = regResult[1];
            var chkObj = orderObj.getCheck(itemNum);
            var selObj = orderObj.getSelect(itemNum);
            var price = orderObj.prices[itemNum];
            var quantity = 0;
            if (selObj) {
                quantity = parseFloat(selObj.options[selObj.selectedIndex].text);
                quantity = isNaN(quantity) ? 0 : quantity;
                if (chkObj) chkObj.checked = quantity;
            } else if (chkObj) {
                quantity = chkObj.checked ? 1 : 0;
            }
            total += quantity * price;
        }
    }
    if (this.precision == -1) {
        orderObj.txtOut.value = total
    } else {
        orderObj.txtOut.value = total.toFixed(this.precision);
    }
};

/*
 * Handle clicks on the checkboxes
 *
 * Required:
 *  The corresponding select elements and input checkboxes need to be numbered the same
 *
 */
this.checkRetotal = function(orderObj, obj) {
    var regResult = orderObj.chkReg.exec(obj.id);
    if (regResult) {
        var optObj = orderObj.getSelect(regResult[1]);
        if (optObj) {
            if (obj.checked) {
                optObj.selectedIndex = orderObj.firstChoice;
            } else {
                optObj.selectedIndex = 0;
            }
        }
        orderObj.totalCost(orderObj);
    }
};

/*
 * Set up events
 */
this.setEvents = function(orderObj) {
    var spanObj = orderObj.frm.getElementsByTagName('span');
    for (var i=0; i<spanObj.length; i++) {
        var regResult = orderObj.priceReg.exec(spanObj[i].id);
        if (regResult) {
            var itemNum = regResult[1];
            var chkObj = orderObj.getCheck(itemNum);
            var selObj = orderObj.getSelect(itemNum);
            if (chkObj) {
                chkObj.onclick = orderObj.getCheckEvent();
            }
            if (selObj) {
                selObj.onchange = orderObj.getSelectEvent();
            }
            if (orderObj.btnTotal) {
                orderObj.btnTotal.onclick = orderObj.getBtnEvent();
            }
        }
    }
};
this.setEvents(this);

/*
 *
 * Grab the prices from the html
 * Required:
 *  Prices should be wrapped in span tags, numbers only.
 */
this.grabPrices = function(orderObj) {
    var spanObj = orderObj.frm.getElementsByTagName('span');
    for (var i=0; i<spanObj.length; i++) {
        if (orderObj.priceReg.test(spanObj[i].id)) {
            var regResult = orderObj.priceReg.exec(spanObj[i].id);
            if (regResult) {
                orderObj.prices[regResult[1]] = parseFloat(spanObj[i].innerHTML);
            }
        }
    }
};
this.grabPrices(this);

}

看看《 浮点指南》 -这仅是由于计算机表示十进制数字的原因,而不是程序本身的错误。

解决方案是使用某种十进制数据类型,而不是浮点数。 Javascript似乎没有本地语言。 请参阅https://stackoverflow.com/questions/744099/javascript-bigdecimal-library进行讨论和一些建议的解决方法。

该指南的特定Javascript的页面上有一个指向Java的BigDecimal库的链接,它将解决您的问题。

解决此问题的复杂且技术上正确的方法是使用某种十进制库,该库在内部不使用浮点数,而是使用所有整数,如其他建议的那样。

根据您使用数字的目的,有时可以通过使用浮点数并将所有内容四舍五入为两位数来使其全部正常工作。 例如,在您的情况下:

14.399999999999999.toFixed(2)= 14.40这是您想要的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM