Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   операция вычетания во флеше (http://www.flasher.ru/forum/showthread.php?t=93446)

BeaviZ 21.03.2007 14:24

операция вычетания во флеше
 
товарищи! подскажите универсальный способ подсчета:

Код:

trace(20.15 - 20);
чтобы получить ответ 0.15.
спасиба!


ЗЫ. из факов и поисков нашёл только:
http://www.flasher.ru/forum/showthre...t=59237&page=3
http://flasher.ru/forum/showthread.php?t=79170

но ответа там нет.

etc 21.03.2007 14:42

Проводи целочисленные операции, а потом дели на 100.

BeaviZ 21.03.2007 14:44

дело в том, что цифры вводятся пользователем :(

т.е. нужно будет определять, сколько знаков после запятой.
потом соответственно умножать на 10 (+ кол-во нулей - это количество знаков) перед округлением, а потом обратно?

etc 21.03.2007 14:55

Ну да. Можно на заведомо бОльшее число знаков умножить (которое пользователь не сможет ввести) и с ним работать.

iNils 21.03.2007 15:03

Код:

function x (a:Number, b:Number):Number {
        var m:Number = Math.max (String (a).split (".")[1].length, String (a).split (".")[1].length) + 1;
        if (isNaN (m)) {
                m = 1;
        }
        var s:Number = Math.pow (10, m);
        return (a * s - b * s) / s;
}
w = 20.15 - 20;
trace (w);
trace (x (w, 0.04));
trace (x (20.15, 20));
trace (x (.15, 0));
trace (x (2, 1));

Обратите внимание на результат синего трейса
Я так понимаю, все равно нужно округлять, даже после умножения числа на 10 в степени N.

BeaviZ 21.03.2007 15:04

Иех, жаль способа лучше нет....
Но, решение найдено. Спасибо.

etc 21.03.2007 15:13

Проблему можно решить иначе. Ведь пользователь вводит точку, а это все строка. Что мешает работать без точки, потом её привинтить?

Как-то так:

Код:

a = '3.15';
b = '0.1';
dota = a.indexOf('.') != -1 ? (a.length-a.lastIndexOf('.')-1) : 0;
dotb = b.indexOf('.') != -1 ? (b.length-b.lastIndexOf('.')-1) : 0;
afterdot = 0;
while (dota<dotb) {
        a += '0';
        afterdot = dotb;
        dota++;
}
while (dotb<dota) {
        b += '0';
        afterdot = dota;
        dotb++;
}
afterdot = dota==dotb ? dota : afterdot;
while (a.charAt(0)=='0') {
        a = a.substr(1);
}
while (b.charAt(0)=='0') {
        b = b.substr(1);
}
na = Number(a.split('.').join(''));
nb = Number(b.split('.').join(''));
nc = na-nb;
c = String(nc);
if (dota != 0 || dotb != 0) {
        if (c.length<=afterdot) {
                while (c.length<afterdot) {
                        c = '0'+c;
                }
                c = '0.'+c;
        } else {
                c = c.substr(0, c.length-afterdot)+'.'+c.substr(-afterdot);
        }
        while (c.charAt(c.length-1)=='0') {
                c = c.substr(0,c.length-2);
        }
        if (c.charAt(c.length-1)=='.') {
                c = c.substr(0,c.length-2);
        }
}
trace(c);

Доработать напильником только надо.


Часовой пояс GMT +4, время: 03:04.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.