PDA

Просмотр полной версии : Количество знаков в числах.


Fogflasher
12.04.2013, 12:56
Всем привет. Еще парочка (вероятно весьма дурацких) нуб-вопросов:

1. Есть ли стандартная функция определяющая количество знаков в переменной int или Number?
Ну то есть, если это 15, то она должна выдавать 2. А для 2.5863 - соотвественно 6.

Можно конешно попробовать превращать числа в строки, а потом считать их длину, например так:

var k_val:Number = 5.12345;
var k_str:String;
var k_len:uint;

k_str = String(k_val);
k_len = // ??? А как определить длину строковой переменной?
//Можно конешно засунуть её в TextField и потом k_len = TextFiled.length; но... избыточность.


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

Wolsh
12.04.2013, 13:09
??? А как определить длину строковой переменной, если она не TextField?Неожиданно, конечно, но у String всего одно свойство — length (http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/String.html#length).

maxkar
12.04.2013, 13:40
А для 2.5863 - соотвественно 6.
Это не соответственно. В этом числе примерно 15-18 знаков. Читать здесь (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html). А то, что выводится, округляется до определенной велчины в момент вывода. Поэтому без контекста округления говорить о "длине числа" неуместно. Так что либо у вас уже известно, до скольки нужно округлять (и тогда вопрос сводится к целой части числа), либо нужно округлять и смотреть, что получилось.

В простейших случаях может помочь Math.log, но не факт, что ручное деление и вычисление количества раз не будет быстрее (для целых чисел, для number самое быстрое через Math.log будет считать количество цифр в целой части).

Fogflasher
12.04.2013, 14:00
Wolsh, кхм... нда, это было неожиданно : ))))

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

Добавлено через 4 минуты
maxkar, значит нужно окрулять... ясно, учтем.
По ссылке мат-часть весьма устрашающая, внушает.

Wolsh
12.04.2013, 15:20
нда, это было неожиданно : ))))В свое время я испытал похожий шок, узнав что length есть у дисплейного объекта TextField. В мою логику вот это не умещается..

in4core
12.04.2013, 16:26
length - серьезно у TF ? первый раз слышу! Может быть tf.text.length имеется ввиду? Если нет - то что оно дает?

chamele0n
12.04.2013, 16:36
это что домашка по информатике ?
интересно с какой целью нужно определять кол-во знаков ? )

Fogflasher
15.04.2013, 09:21
in4core, насколько я понимаю:
length : int
[read-only] The number of characters in a text field.

chamele0n, а цель весьма примитивна, нужно проставлять паддинг нули в счетчике.
Ну то есть 1 или 5 заменять на 01 и на 05 соотвественно.
Ну, плюс патч универсальности: заменять также 99 на 099, например, и т.п.

Наверное это можно сделать другими средствами, но хрен его знает как еще, не зная длины?
Может быть есть какие-то стандартные хреновины для padding нулей, но врядли.

cleptoman
15.04.2013, 10:31
как то не совсем понятна задача...как соотносится дробное число и счетчик с циферками?..т.е. к чему там нулики дорисовывать?

caseyryan
15.04.2013, 10:37
Просто, я как бы не подозревал, что у типов данных тоже могут быть свойства и методы.
А типы данных это что?
И здесь не у типа данных свойство, а у экземпляра с типом данных String

wvxvw
15.04.2013, 10:40
Тут сразу появляется множество проблем: числа с плавающей запятой не могут "хорошо" представить очень много десятичных дробей. "Хорошо" значит, что 0.2 будет на самом деле 0.19999999999 - или как-то так. Опять же, в числах с плавающей запятой есть такие константы как Infinity - сколько знаков в нем? (по соглашению, Infinity = 1e200 если не ошибаюсь, но что это нам дает?).

В ANSI CL есть похожая функция, но она только для целых, и считает не десятичные знаки, а биты - в таком контексте она имеет значение. Количество десятичных символов может иметь значение, если вы пытаетесь распечатать числа "красиво", но, как правило, вопрос стоит по-другому: как вписать имеющееся число в отведенное для него место с минимальной потерей точности.

Есть еще такой момент: а что если число представлено в научной записи (с экспонентой в степени Х)? - что в вашем понимании является знаками числа?

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

Wolsh
15.04.2013, 10:59
Да лидинг то просто делается
while(str.length < digits) str = "0" + str;
или, если нужное количество знаков постоянно и известно заранее, то
str = ("000000" + str).substr(-6);

Fogflasher
15.04.2013, 14:18
А типы данных это что?
Что-то внушающее баттхерт абстрактного.
Понятно, что это "наверное тоже какой-то класс", но...

wvxvw, Выбрать значение максимальной погрешности epsilon, и делить число на 10, пока результат от деления не будет меньше epsilon - вот сколько раз поделили - столько знаков в числе и есть.
В целом идея понятна. О практической реализации пока стоит помолчать.

Wolsh, спасибо, пробую понять как эти строки работают.

Навскидку:
В первом случае не совсем понятно что такое digits, и если это переменная то как задается ранее.

Во втором случае... не совсем очевиден финт с -6... Если например у нас str = 5483, то str => 0000005483 (и считем с конца 6 знаков, получим) => 005483, как-то так походу.

iNils
15.04.2013, 14:27
или, если нужное количество знаков постоянно и известно заранее, то
str = ("000000" + str).substr(-6);Да необязательно знать заранее. Строчка с нулями может быть сразу большой длины. Сделай 15 штук нулей, это уже триллион - думаю хватит в 99,99%

Sintesis
15.04.2013, 14:53
Просто, я как бы не подозревал, что у типов данных тоже могут быть свойства и методы.

Тип это и есть класс.

Wolsh
15.04.2013, 15:04
В первом случае не совсем понятно что такое digits, и если это переменная то как задается ранее.Количество знаков, которого нужно достичь, дописывая лидирующие нули. Переменная, да. То же, что во втором примере 6.
получим) => 005483, как-то так походуВ этом смысл лидирующих нулей. Нет? Если нужно один ноль дописать, то в чем вообще проблема?

Fogflasher
15.04.2013, 15:40
Да нет, это просто размышления вслух были. Конешно, именно это и нужно.