1.3400 === 1.34 === 1.340000000000
нулей в конец можно дописать сколько угодно. (Математика 5 класс)
В функцию передается число: 1.3500, 1.36, 1.2…
Функция должна возвращать количество цифр после точки
WUT?
Что требуется? Всегда возвращать четыре, или всё таки игнорировать нули?
Воспользовавшись здравым смыслом, рискну предположить, что нули игнорируются, тогда с этим соусом.
Довольно странная задача и формулировка. Хотите определять _нематематический_ вид числа, представляйте (вводите) его как строку. А вы хотите проводить математические операции с нематематическим сущностями. Как-то немного запутанно получается.
Действительно интересно, возможно ли это. Сдается, что врядли, ведь флоат – это не 1.35000, а что-то вроде 1.35000124124512512581259283593857238905823782358723592308592385923905 где-то там далеко. Поэтому как дать понять php, сколько цифр из него вы хотите использовать без явного указания по средствам number_format или операции округления ?
$s = '1.3400';
var_dump(explode('.', $s));
array(2) {
[0]=>
string(1) "1"
[1]=>
string(4) "3400"
}
Делал что то похоже
получилось так
$devide = (float)'1.3400'; //исходное число, при float отрезает не нужные 0
$explodeDigits = explode('.', (string)$devide); //делим по запятой
echo strlen((string)$explodeDigits[1]); //количество знаков после запятой
Not really, the number of decimal places is a function of the internal representation of the number. What you see when you display the number is, is the number as a string for printing.
So if you are interested in the displayed value, you can control the number of decimal places with formatting directives in the first place e.g., %5.2f
, or use the string function approach as you mention in your post after the fact once you have the number as a string.
Also, as an aside, would you count trailing zeros?
Perhaps it would be helpful to state your goal for wanting to do this? There might be other ways to accomplish what you are looking to do.
Update:
Based on your update, the problem is really not counting decimal places, rather you are running into represenation issue/rounding errors (not that uncommon). The problem is that some fractional values can’t be exactly represented in base 2. Here’s an exhaustive explanation: What Every Computer Scientist Should Know About Floating-Point Arithmetic.
Take a look at this SO question: Understanding floating point representation errors; what’s wrong with my thinking?
You can try this approach to round the value:
float rounded_val = floorf(value * 100.0 + 0.5) / 100.0;
Wikipeadia has a whole article on rounding.
f f
Ученик
(64),
закрыт
5 лет назад
Олег Олегович
Просветленный
(22336)
5 лет назад
//double d = 100;
double d = 100.123456789012;
int i = 0;
while (d * Math.Pow(10, 1 + i) % 10 != 0) { i++; }
Console.WriteLine(“У числа {0} {1} знаков после запятой.”, d, i–);
f fУченик (64)
5 лет назад
“У числа 1,569975 7 знаков после запятой.”
Эх, близко, но не то. Там алгоритм сложнее…
f f
Ученик
(64)
Можно, конечно, с округлением поиграть, но это тоже как-нибудь да сломает программу
Алекс Куха
Высший разум
(427016)
5 лет назад
Число значащих цифр для каждого типа известно заранее. (7/15)
f fУченик (64)
5 лет назад
Я имею ввиду следующее:
Пользователь ввел число 123,4985
Надо вывести 4 (потому что 4985)
Алекс Куха
Высший разум
(427016)
не факт. Введённое число необязательно будет равно хранимому в памяти
Sergey
Гуру
(2682)
5 лет назад
число дабл содержит 52+1 бит в мантиссе. Это соответствует ~15 десятичным знакам.
Если число цифр после запятой это, число значимых знаков после запятой в виде ХХХХ. YYYY, то это 15 – log10(число).
Сергей Куксенков
Просветленный
(41944)
5 лет назад
double number = 129.12563;
int count = BitConverter.GetBytes(decimal.GetBits((decimal)number)[3])[2];
Console.WriteLine(count); // 5
Как это работает тут: matthewedmondson . info / 2014 / 03 / reliance-on-implementation-details . html
ВСЕМ ПРИВЕТ!!!!!!!!!КАК ПОДСЧИТАТЬ КОЛИЧЕСТВО ЗНАКОВ ПОСЛЕ ЗАПЯТОЙ. |
|
VDM Пользователь Сообщений: 779 |
как то так: |
=ДЛСТР(ПОДСТАВИТЬ(ОСТАТ(A1;1);”0,”;””)) |
|
grant84 Пользователь Сообщений: 129 Anatolyi |
В этой отдельной клетке: =ДЛСТР(A1)-ПОИСК(“,”;A1;1) Я соображаю, но не всегда. 🙂 |
grant84 Пользователь Сообщений: 129 Anatolyi |
A1 – это клетка где написано 4,2375. Я соображаю, но не всегда. 🙂 |
Hugo Пользователь Сообщений: 23365 |
Макроса не хватает 🙂 |
vikttur Пользователь Сообщений: 47199 |
=ДЛСТР(A1)-ПОИСК(“,”;A1) |
GrAnt, это форум по Excel. То что вы называете клеткой в excel принято называть ячейкой. |
|
На конкурс замороченности :)) Массив =ПОИСКПОЗ(МИН(ДЛСТР(A1*10^СТРОКА(1:15)));ДЛСТР(A1*10^СТРОКА(1:15));) |
|
4,001203 |
|
KuklP Пользователь Сообщений: 14868 E-mail и реквизиты в профиле. |
Да нет. У Hugo тоже верно. Я сам – дурнее всякого примера! … |
Виноват.Смотрел только формулы. |
|
KuklP Пользователь Сообщений: 14868 E-mail и реквизиты в профиле. |
Ну я бы к способу Игоря добавил проверку на целое. Заодно и незначащие нули после запятой проигнорирует: Я сам – дурнее всякого примера! … |
R Dmitry Пользователь Сообщений: 3103 Excel,MSSQL,Oracle,Qlik |
#14 19.02.2011 12:13:05 до кучи….
|
|
KuklP Пользователь Сообщений: 14868 E-mail и реквизиты в профиле. |
Дим, а если системный разделитель точка? У Игоря он вычисляется Mid(1 / 2, 2, 1). Я сам – дурнее всякого примера! … |
слэн Пользователь Сообщений: 5192 |
для разнообразия: Function nz&(x#) |
{quote}{login=KukLP}{date=19.02.2011 01:00}{thema=}{post}Дим, а если системный разделитель точка? У Игоря он вычисляется Mid(1 / 2, 2, 1).{/post}{/quote}Можно не вычислять, но текст длиннее: =44414= каре |
|
vikttur Пользователь Сообщений: 47199 |
{quote}{login=Маугли}{date=19.02.2011 11:21}{thema=}{post}4,001203 |
KuklP Пользователь Сообщений: 14868 E-mail и реквизиты в профиле. |
В посте от 19.02.2011, 11:39 при целом вернет 0. Я сам – дурнее всякого примера! … |
VDM Пользователь Сообщений: 779 |
{quote}{login=Маугли}{date=19.02.2011 11:21}{thema=}{post}4,001203 Пока не понял из-за чего так происходит, но свою формулу подправил: |
R Dmitry Пользователь Сообщений: 3103 Excel,MSSQL,Oracle,Qlik |
#21 19.02.2011 17:56:59 Function znak(vl#)
|
|
kim Пользователь Сообщений: 3139 Игорь |
Не видел тему 🙂 |
🙂 Массив |
|
captainbarsik Пользователь Сообщений: 12 |
#24 22.02.2011 16:31:08 ВСЕМ СПИСБО!!!!!ВСЕХ С ПРАЗДНИКОМ МУЖИКИ!!!!! |
Вы можете использовать регулярное выражение для синтаксического анализа value
, записи десятичных цифр и подсчета длины совпадения, если таковые имеются:
import re
def num_decimal_places(value):
m = re.match(r"^[0-9]*.([1-9]([0-9]*[1-9])?)0*$", value)
return len(m.group(1)) if m is not None else 0
это немного меньше “сырых”, чем разделение строки с помощью нескольких if else
, но не уверен, что они более простые или более читаемые.
Stefano Sanfilippo
26 фев. 2015, в 19:36
Поделиться
Вам не нужно регулярное выражение, вы можете конвертировать в float
и конвертировать обратно в строку! это автоматически удалит нули:
>>> def convertor(s):
... try :
... int(s.rstrip('0').rstrip('.'))
... return 0
... except:
... return len(str(float(s)).split('.')[-1])
...
>>> convertor('4.0230')
3
>>> convertor('4.0')
0
>>> convertor('4')
0
Kasramvd
26 фев. 2015, в 19:52
Поделиться
вы также можете просто попробовать что-то вроде:
try:
return len(str(num).split('.')[1].rstrip('0'))
except
return 0
acushner
26 фев. 2015, в 19:21
Поделиться
Самый лучший и самый Pythonic способ достичь этого:
import decimal
x = '56.001000'
x = x.rstrip('0') # returns '56.001'
x = decimal.Decimal(x) # returns Decimal('0.001')
x = x.as_tuple().exponent # returns -3
x = abs(x) #returns 3
Выше код можно записать проще:
>>> x = '56.001000'
>>> abs(decimal.Decimal(x.rstrip('0')).as_tuple().exponent)
3
Ниже приведен список используемых функций для дополнительной справки:
- str.rstrip(): вернуть копию строки с удаляемыми концевыми символами.
- decimal.Decimal(): создать новый десятичный объект, основанный на значении.
- x.as_tuple(): возвращает namedtuple в формате: DecimalTuple (знак = 0, цифры = (1,), показатель = -3)
- abs(): вернуть абсолютное значение числа.
Moinuddin Quadri
26 фев. 2015, в 19:55
Поделиться
import re
def f(s):
ls = s.split('.', 1)
if len(ls) == 2 and re.match(r'd*$', ls[1]):
return len(ls[1].rstrip('0'))
return 0
assert f('12') == 0
assert f('12.') == 0
assert f('12.1') == 1
assert f('12.100006') == 6
assert f('12.1.3') == 0
assert f('12.1abc') == 0
assert f('12.100000') == 1
ferhat elmas
26 фев. 2015, в 19:47
Поделиться
Строковым процессом:
- Проверить
.
присутствует в числовой строке или нет. - Если нет, то верните 0.
- Если присутствует строка с разделительным номером на
.
и получить второй элемент из результата split. - Удалите 0 с правой стороны.
- Возврат len элемента.
код:
>>> def dCount(no_str):
... if "." in no_str:
... return len(no_str.split(".")[1].rstrip("0"))
... else:
... return 0
...
>>> dCount("2")
0
>>> dCount("2.002")
3
>>> dCount("2.1230")
3
>>> dCount("2.01230")
4
>>>
Vivek Sable
26 фев. 2015, в 18:16
Поделиться
Вы можете попробовать использовать функцию Decimal
в python:
abs(Decimal(string_value).as_tuple().exponent)
как объяснено в
Легкий способ поиска десятичных знаков
Pedro Braz
26 фев. 2015, в 19:29
Поделиться
Ещё вопросы
- 1Как получить текущий элемент в Dropdownlist для ASP.NET
- 0Почему мой конструктор копирования не работает с новым вызовом и имеет тот же адрес памяти?
- 0Есть ли способ добавить атрибут только в 1 строку в SQL?
- 0AngularJS не будет переключать вид
- 0Получение Mac (системного физического адреса) адреса успешно на локальном хосте, но не на сервере
- 0Отправить Push-уведомление на все токены в базе данных MySql
- 0Сохранить адрес узла списка ссылок
- 0Jquery прокрутить до элемента, только если он еще не виден
- 1Указание явного типа для развертывания Maven
- 0Почему десятичные поля принимают буквы в предложении where?
- 0JavaScript извлекает значение innerHTML из класса, который использует несколько тегов
- 0AngularJS: почему поиск не работает должным образом?
- 1Почему этот код JavaScript допустим и работает с запятыми в квадратных скобках? [Дубликат]
- 1Автоматическая установка плагинов в Android Studio
- 0Передать параметр в функцию контроллера Angularjs из директивы
- 0Как я могу обновить ту же запись SqlServer внутри цикла sqlsrv_fetch_array?
- 0AngularJS + ASP.NET MVC: маршрутизация URL без соответствующего физического представления
- 1Удаление плохих пикселей с помощью массива dask
- 1Thread.sleep () не позволяет другим потокам работать?
- 0отправить ответ из node.js в Jquery
- 0сбой линии связи mysql на 2 ноутбуках
- 0PHP заполнить выпадающий список с помощью jquery
- 0Невозможно связаться с GraphicsMagik
- 0Как проверить, следует ли пользователь за другим, перед тем как подписаться или отписаться (прикрепить)
- 0отправить выбранные данные в таблицу php
- 1Добавление минут к метке времени в python
- 0Создание угловой директивы для повторного использования кода – ошибка синтаксического анализа при создании HTML
- 1Использование интерфейса в качестве контракта данных для службы WCF
- 0Установка переменной в сервисе .config в Angular JS?
- 0Гиперссылки в сообщении Gmail
- 0JQuery обратный вызов, когда 3 метода завершены?
- 1Как отобразить массив в массиве на Highcharts? [JS]
- 0Cron Jobs на GAE с PHP
- 0Вызов C ++ (член) функционирует динамически
- 0Переменная класса C ++, возвращающая бред
- 1Не удается позвонить из Android WebView
- 0Angularjs JSON разбор проблемы
- 0Twig не может создать каталог кеша
- 0pouchdb не определяется в приложении angularjs
- 1Как отправить объекты разных классов в одном сообщении Json, чтобы их можно было десериализовать с помощью Gson?
- 0Qt: joinMulticastGroup для всего интерфейса
- 1Как мне перенести расширение в VB.NET на C #?
- 0Несколько HTML-форму и отправить
- 0jQuery .on (), .live () и .click () работают только один раз
- 0Скрыть / показать веб-часть, щелкнув гиперссылку в карусели Sharepoint 2010
- 0Пользовательские домены для одного сайта
- 0Семейство столбцов Cassandra отображается по-разному через CLI и DataStax
- 0Как форматировать числа с помощью регулярных выражений и PHP
- 0Получить значения из QDialog
- 0Страница открыта с использованием загрузки jQuery с неверными путями к изображениям