Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Результат вычислений в экспоненциальной форме (https://javascript.ru/forum/misc/3214-rezultat-vychislenijj-v-ehksponencialnojj-forme.html)

Sharp 29.03.2009 22:41

Результат вычислений в экспоненциальной форме
 
Здравствуйте, товарищи!
Сегодня решил начать изучение JavaScript. Купил книжку, весь день увлеченно ее читал, и решил (ясное дело) написать чего-нибудь.

Остановился на экспоненциальной форме записи чисел. Судя по всему, результаты вычислений над большими числами записываются именно в такой форме. То есть вместо того, чтобы представить результат как 0.00000000000007, JS делает так: 7e-14. Так вот, решил я написать функцию, переводящую такой результат в "нормальный". Получилось следующее:
<html> 
<head> 
<script> 
function NoExp(str_number) { 
var IsExp = 0; 
var chrLen = 0; 
var dotPosition = 0; 
var i = 0; 
IsExp = str_number.lastIndexOf("-"); 
if (IsExp > 0) { 
chrLen = str_number.substr(IsExp + 1, str_number.length - IsExp - 1); 
str_number = str_number.substring(0, IsExp - 1); 
dotPosition = str_number.indexOf("."); 
str_number = str_number.replace(".", ""); 
while (i < chrLen - dotPosition) { 
str_number = "0" + str_number; 
i++; 
} 
str_number = "0," + str_number; 
alert(str_number); 
} 
IsExp = str_number.lastIndexOf("+"); 
if (IsExp > 0) { 
chrLen = str_number.substr(IsExp + 1, str_number.length - IsExp - 1); 
str_number = str_number.substring(0, IsExp - 1); 
dotPosition = str_number.length - str_number.indexOf(".") - 1; 
alert(dotPosition); 
str_number = str_number.replace(".", ""); 
while (i < chrLen - dotPosition) { 
str_number = str_number + "0"; 
i++; 
} 
str_number = str_number; 
alert(str_number); 
} 
} 
</script> 
</head> 
<input type="button" onclick="NoExp('33.2424e-8')" value="OK"> 
</html>

(Ох, даже стыдно показывать этот бред.)
Оцените, пожалуйста. А еще лучше - расскажите про правильный алгоритм.

И еще вопрос. В каких случаях в конце строчки кода ставится точка с запятой? Не совсем понимаю.

Огромное спасибо за внимание!

ZoNT 30.03.2009 13:31

function NoExp(s){
    return s.toFixed(100).replace(/(.*0\.0*[1-9]*)0+\d*/g,'$1')
}

AzriMan 30.03.2009 15:05

согласно стандарту ЕСМА, в конце строчки точка с запятой ";" может как ставиться, так и не ставиться.

p.s. 2 ZoNT - это пять!

Sharp 30.03.2009 19:30

Спасибо всем.
Насколько мне стало известно, аргумент метода toFixed не может принимать значение, большее 20. И еще, toFixed не поддерживается в Netscape. Какие еще могут быть варианты преобразования экспоненциального числа?

Kolyaj 30.03.2009 23:29

Цитата:

Сообщение от Sharp
toFixed не поддерживается в Netscape

Где вы его откопали?

Sharp 30.03.2009 23:56

Где-то читал...
Но там говорилось про n-версии Netscape (не помню точно, но что-то типа 4-6). Хотя у меня в седьмой версии все нормально работает (сейчас проверил).

Просьба. Объясните мне пожалуйста смысл вот этой строчки:
replace(/(.*0\.0*[1-9]*)0+\d*/g,'$1')

Kolyaj 31.03.2009 00:01

Цитата:

Сообщение от Sharp
Просьба. Объясните мне пожалуйста смысл вот этой строчки

Это настолько безграмотное регулярное выражение, что диву даешься, и думать для чего оно, разумеется нет никакого желания :)

Sharp 31.03.2009 00:19

:)

ZoNT 31.03.2009 11:00

когда нет желания думать - это диагноз...

Kolyaj 31.03.2009 11:23

Цитата:

Сообщение от ZoNT
когда нет желания думать - это диагноз...

Это к чему?

x-yuri 01.04.2009 04:15

ZoNT,
1) параметр toFixed не должен быть больше 20
2) непонятно, как оно работает (если честно, я тоже забил разбираться)
3) оно не решает задачу (например, при 7e-30)

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

ZoNT 01.04.2009 11:24

Вполне может быть, что моё решение не работает, так как я тестил только в консоли в ФФ:

Ну и конечно же оно не предназначено для случая е+

Sharp 01.04.2009 12:35

Цитата:

Сообщение от x-yuri (Сообщение 15671)
Sharp, стоит сразу договориться, что вопрос теоретический (т.е. на практике вряд ли встретится). По-крайней мере, мне не пришла в голову конкретная ситуация, когда это может понадобится

Ну, допустим, я пишу программу, предназначенную для вычисления емкости колебательного контура по известной индуктивности и резонансной частоте.

f = 96МГц
L = 0.274мкГн

В результате вычислений (результат в Фарадах) получается, что искомое значение емкости равно:
1.0031069383690234e-11Ф

В неэкспоненциальной форме этот результат выглядит как 0.0000000000100031069383690234Ф, что более привычно глазу.
0.0000000000100031069383690234Ф приблизительно равно 10пФ.

P.S.
На самом деле я такую программу действительно пишу, вернее, почти написал (вчера начал). Осталось только разобраться в выводом результата в неэкспоненциальной форме.
Как считаете, что мне с ним сделать?

Kolyaj 01.04.2009 12:38

Более привычно глазу в пФ, вот и выводите результат в них.

Sharp 01.04.2009 12:49

Впринципе, самый компромиссный режим - выводить в микрофарадах.

Хотя, стоп. Можно сделать рядом с полем вывода результата специальный низспадающий список, в котором можно будет выбрать дольную/кратную единицу измерения, и в соответствии с выбранным значением, результат отформатируется. Вот, ИМХО, самое разумное решение.
Kolyaj, как считаете?

Kolyaj 01.04.2009 13:01

Я бы стал выводить сразу в тех единицах, в которых легче воспринять результат. Т.е. если результат достаточно большой, то в микро, если маленький, то в пико.

Sharp 01.04.2009 13:44

Согласен, хороший вариант.
Вот моя реализация:
<script>
function formatResult(a) {
   var b = "";
   if (a < 0.000000001) {a = a * 1000000000000; b = a + "пФ"}
   if (a < 0.000001) {a = a * 1000000000; b = a + "нФ"}
   if (a < 0.1) {a = a * 1000000; b = a + "мкФ"}
   if (a < 1) {b = a + "Ф"}
   return b;
}
</script>
<input name="txtResult" value="0.0025">
<input type="button" onclick="alert(formatResult(txtResult.value))">

Можно ли это как-нибудь оптимизировать?

x-yuri 01.04.2009 19:12

Sharp, удобнее результат 0,1 пФ (для 1.0031069383690234e-11Ф), может быть с большей, заранее заданной точностью

кроме того, удобнее, чтобы результат выдавался в одних и тех же единицах. Но к универсальному калькулятору это не применимо - лучше твой вариант, только точность ограничить можно, думаю

p.s. универсальные решения чем-то сродни теоретическим, похоже

ZoNT, а как насчет 7e-150? и почему не replace(/0*$/, '') ?

ZoNT 02.04.2009 12:08

Ну, я бы не стал такие вычисления на js делать, поэтому и не стал бы думать даже над такой функцией... Да и не представляю я, зачем мне нужно перед глазами число, в котором более 12 нулей подряд... Мне наоборот импонирует запись в экспоненциальной форме.

Почему не replace(/0*$/, '')???
ну попробуй сделать alert(3.23e-7.toFixed(100))... Посмотри, что получится...

x-yuri 02.04.2009 21:59

Цитата:

Ну, я бы не стал такие вычисления на js делать, поэтому и не стал бы думать даже над такой функцией
как я говорил, данная задача редко встречается на практике, имхо. Но если уж писать такую функцию, то надо, чтобы она работала для всех входных параметров я думаю. Есть и другие значения, которые не учитывает твоя функция

Цитата:

Почему не replace(/0*$/, '')???
ну попробуй сделать alert(3.23e-7.toFixed(100))... Посмотри, что получится...
а-а, ты убираешь непонятно откуда берущиеся знаки (у ff точность больше, чем предусмотрено стандартом?). Я считаю, что их надо оставить, потому что это реальное значение, которое хранится в компьютере. А если некрасиво - округлять надо (за пределами функции)


Часовой пояс GMT +3, время: 00:05.