Как найти количество цифр после запятой

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

 

ВСЕМ ПРИВЕТ!!!!!!!!!КАК ПОДСЧИТАТЬ КОЛИЧЕСТВО ЗНАКОВ ПОСЛЕ ЗАПЯТОЙ.  
НАПРИМЕР ЧИСЛО 4,2375-ЧТОБЫ В ОТДЕЛЬНОЙ КЛЕТКЕ БЫЛ РЕЗУЛЬТАТ-4.

 

VDM

Пользователь

Сообщений: 779
Регистрация: 22.12.2012

как то так:  
=ДЛСТР(“”&(A1-ЦЕЛОЕ(A1)))-2

 

=ДЛСТР(ПОДСТАВИТЬ(ОСТАТ(A1;1);”0,”;””))

 

grant84

Пользователь

Сообщений: 129
Регистрация: 01.01.1970

Anatolyi

В этой отдельной клетке: =ДЛСТР(A1)-ПОИСК(“,”;A1;1)

Я соображаю, но не всегда. 🙂

 

grant84

Пользователь

Сообщений: 129
Регистрация: 01.01.1970

Anatolyi

A1 – это клетка где написано 4,2375.

Я соображаю, но не всегда. 🙂

 

Hugo

Пользователь

Сообщений: 23365
Регистрация: 22.12.2012

Макроса не хватает 🙂  
[b1] = Len(Split([a1], Mid(1 / 2, 2, 1))(UBound(Split([a1], Mid(1 / 2, 2, 1)))))

 

vikttur

Пользователь

Сообщений: 47199
Регистрация: 15.09.2012

=ДЛСТР(A1)-ПОИСК(“,”;A1)  
Нужно ли проверять на отсутвие запятой (целое число)?

 

GrAnt, это форум по Excel. То что вы называете клеткой в excel принято называть ячейкой.

 

На конкурс замороченности :)) Массив  

  =ПОИСКПОЗ(МИН(ДЛСТР(A1*10^СТРОКА(1:15)));ДЛСТР(A1*10^СТРОКА(1:15));)

 

4,001203  
Верно только у Vikttur и Казанского.

 

KuklP

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

Да нет. У Hugo тоже верно.

Я сам – дурнее всякого примера! …

 

Виноват.Смотрел только формулы.

 

KuklP

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

Ну я бы к способу Игоря добавил проверку на целое. Заодно и незначащие нули после запятой проигнорирует:  
Public Function Ost(s#) As Integer  
   Ost = IIf(Int(s) = s, 0, Len(Split(s, Mid(1 / 2, 2, 1))(UBound(Split(s, Mid(1 / 2, 2, 1))))))  
End Function

Я сам – дурнее всякого примера! …

 

R Dmitry

Пользователь

Сообщений: 3103
Регистрация: 22.12.2012

Excel,MSSQL,Oracle,Qlik

#14

19.02.2011 12:13:05

до кучи….  
Function znak(vl$)  
Dim a  
a = Split(vl & “,”, “,”)  
znak = IIf(UBound(a) > 1, Len(a(1)), 0)  
End Function

Спасибо

 

KuklP

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

Дим, а если системный разделитель точка? У Игоря он вычисляется  Mid(1 / 2, 2, 1).

Я сам – дурнее всякого примера! …

 

слэн

Пользователь

Сообщений: 5192
Регистрация: 16.01.2013

для разнообразия:  

  Function nz&(x#)  
Dim r#  
On Error GoTo er  
Do  
   If r / (x – Int(x)) > 1000 Then Exit Function  
   r = x – Int(x)  
   x = x * 10  
   nz = nz + 1  
Loop  
er:  
End Function

 

{quote}{login=KukLP}{date=19.02.2011 01:00}{thema=}{post}Дим, а если системный разделитель точка? У Игоря он вычисляется  Mid(1 / 2, 2, 1).{/post}{/quote}Можно не вычислять, но текст длиннее:  
application.International(xlDecimalSeparator)  
или  
application.International(3)  

  =44414= каре

 

vikttur

Пользователь

Сообщений: 47199
Регистрация: 15.09.2012

{quote}{login=Маугли}{date=19.02.2011 11:21}{thema=}{post}4,001203  
Верно только у Vikttur и Казанского.{/post}{/quote}  
Проверьте целое число. До конца не верно ни у кого 🙂  
Но нет формулы на все случаи.

 

KuklP

Пользователь

Сообщений: 14868
Регистрация: 21.12.2012

E-mail и реквизиты в профиле.

В посте от 19.02.2011, 11:39 при целом вернет 0.

Я сам – дурнее всякого примера! …

 

VDM

Пользователь

Сообщений: 779
Регистрация: 22.12.2012

{quote}{login=Маугли}{date=19.02.2011 11:21}{thema=}{post}4,001203  
Верно только у Vikttur и Казанского.{/post}{/quote}  

  Пока не понял из-за чего так происходит, но свою формулу подправил:  
=ДЛСТР(“”&(ОКРУГЛ(A1-ЦЕЛОЕ(A1);ДЛСТР(A1)-2)))-2  
Вроде правильно считает:)

 

R Dmitry

Пользователь

Сообщений: 3103
Регистрация: 22.12.2012

Excel,MSSQL,Oracle,Qlik

#21

19.02.2011 17:56:59

Function znak(vl#)  
znak = Len(Split(Replace(vl, “.”, “,”) & “,”, “,”)(1))  
End Function  
По заказу Сергея :)оптимизировал для разных локалей…

Спасибо

 

kim

Пользователь

Сообщений: 3139
Регистрация: 23.12.2012

Игорь

Не видел тему 🙂  
Без текстовых  
=ПОИСКПОЗ(1;1/(ОСТАТ(A1*10^СТРОКА(1:15);10)=0);)-1  
Массив

 

🙂 Массив  
=ПОИСКПОЗ(;ОСТАТ(A1*10^СТРОКА(1:15);10);)-1

 

captainbarsik

Пользователь

Сообщений: 12
Регистрация: 01.01.1970

#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 с неверными путями к изображениям

Добавить комментарий